2011-07-19 60 views
4

我使用WPF與ListView控制。WPF列表視圖行背景閃爍效果

當某個參數設置爲True,我想在ListView行有一個閃爍的動畫。

我有下面的代碼工作,但是動畫停止一次鼠標在與動畫的行。

我想動畫繼續,直到參數變回False。

<ListView.ItemContainerStyle> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="IsSelected" Value="{Binding Selected}"/> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding DoBlink}" Value="True"> 
       <DataTrigger.EnterActions> 
        <BeginStoryboard> 
         <Storyboard FillBehavior="Stop"> 
          <ColorAnimation Storyboard.TargetProperty="(Control.Background).(SolidColorBrush.Color)" 
              From="Blue" To="LightBlue" Duration="0:0:0.2" 
              AutoReverse="True" RepeatBehavior="Forever" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </DataTrigger.EnterActions> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</ListView.ItemContainerStyle> 
+0

在我看來,當你的鼠標結束時,它會觸發背景變化。你可能不得不在Blend中爆炸控制,看看它是否。另一種可能是你的背景有些東西,它可能仍然在閃爍。看看Snoop。 –

+1

似乎listview默認的鼠標懸停動畫正在停止你...你可以控制這個特洛伊混合 – Bathineni

回答

6

這種情況將需要MultiDataTrigger。嘗試這樣的事情。

<Style 
     TargetType="{x:Type ListViewItem}"> 
     <Setter Property="IsSelected" Value="{Binding Selected}"/> 
     <Setter 
      Property="Template"> 
      <Setter.Value> 
       <ControlTemplate 
        TargetType="{x:Type ListViewItem}"> 
        <Border 
         Name="Border" 
         SnapsToDevicePixels="True" 
         Padding="2,2,2,2" 
         Background="Transparent"> 
         <ContentPresenter /> 
        </Border> 
        <ControlTemplate.Triggers> 
         <MultiDataTrigger> 
          <MultiDataTrigger.Conditions> 
           <Condition 
            Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsMouseOver}" 
            Value="True" /> 
        <Condition 
         Binding="{Binding DoBlink}" 
         Value="True" /> 
          </MultiDataTrigger.Conditions> 
          <MultiDataTrigger.EnterActions> 
           <BeginStoryboard 
            Name="Flash"> 
            <Storyboard 
             FillBehavior="Stop"> 
             <ColorAnimation 
              Storyboard.TargetProperty="Background.Color" 
              Storyboard.TargetName="Border" 
              From="Blue" 
              To="LightBlue" 
              Duration="0:0:0.2" 
              AutoReverse="True" 
              RepeatBehavior="Forever" /> 

            </Storyboard> 
           </BeginStoryboard> 
          </MultiDataTrigger.EnterActions> 
         </MultiDataTrigger> 
         <MultiDataTrigger> 
          <MultiDataTrigger.Conditions> 
           <Condition 
            Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsMouseOver}" 
            Value="False" /> 
           <Condition 
            Binding="{Binding DoBlink}" 
            Value="True" /> 
          </MultiDataTrigger.Conditions> 
          <MultiDataTrigger.EnterActions> 
           <StopStoryboard 
            BeginStoryboardName="Flash" /> 
          </MultiDataTrigger.EnterActions> 
         </MultiDataTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

你還需要使用MultiDataTrigger停止動畫當條件匹配時,您希望它停止。

編輯:你可以閱讀有關MultiDataTriggers here

編輯2:我已經修改了代碼與控制模板的工作,並添加一組條件選擇另一項目時停止動畫。

EDIT 3:刪除不需要IsSelected條件。

+0

我收到一個異常「必須爲'Binding'設置非空值。」 ,我發現由於 「<條件屬性=」 IsMouseOver 「值= 」真「/>」,我取代其,與<條件綁定= 「{結合的RelativeSource = {的RelativeSource自},路徑= IsMouseOver}」 值=」真正的「/>但現在它根本不觸發。 – RuSh

+0

在我看來,像列表視圖的默認樣式正在成爲障礙。使用相同的代碼,但將Storyboard.TargetProperty更改爲Control.Foreground。我能夠讓它閃爍。 –

+0

帶有控件模板的新示例應該適合您。 –

2

使用StyleSnooperPeter Blois' Snoop檢查一下鼠標懸停在做什麼。我懷疑你有一個MouseOver處理程序會覆蓋你的StoryBoard。您可以爲您的ListBox項目(或其中的某些內容)創建您自己的不包含MouseOver處理程序的樣式,或者如果您的其他條件爲真,請使用MultiTrigger不要執行MouseOver。

+0

你可以請提供示例代碼?謝謝。 – RuSh

+1

斯科特的回答如下給出了一個很好的例子。如果你使用他的代碼,請隨時接受他的回答。 –

+0

由於某種原因,他的代碼無法正常工作。 – RuSh