2011-04-19 88 views
12

在WPF工具包datagrid中我有一個數據觸發器綁定到單元格的不透明度。WPF。如何通過綁定來停止數據觸發動畫?

UpVisibility更改爲1時,路徑變爲可見,並且動畫開始將其淡入0。

但是我現在的問題 - 如果我需要提前停止/取消衰落和正在設置UpVisibility爲0的路徑仍然是可見和衰落什麼都沒有發生....

如何降不透明度爲0即時使用MyValue對象?

<Path Data="M 5,0 0,10 10,10" Height="10" Width="10" Fill="Green" Opacity="{Binding MyValue[0].UpVisibility}" Margin="5,0,5,0"> 
    <Path.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyValue[0].UpVisibility}" Value="1.0"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:10" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Path.Style> 
</Path> 

回答

7

你有沒有嘗試過這樣的事情(例如未經測試):

<Path Data="M 5,0 0,10 10,10" Height="10" Width="10" Fill="Green" Opacity="{Binding MyValue[0].UpVisibility}" Margin="5,0,5,0"> 
    <Path.Style> 
     <Style> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding MyValue[0].UpVisibility}" Value="1.0"> 
        <DataTrigger.EnterActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:10" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.EnterActions> 
        <DataTrigger.ExitActions> 
         <BeginStoryboard> 
          <Storyboard> 
           <DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.0" Duration="0:0:0" /> 
          </Storyboard> 
         </BeginStoryboard> 
        </DataTrigger.ExitActions> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Path.Style> 
</Path> 

我的動畫時間設置爲0,待快熟。如果您沒有定義From屬性,則指示WPF以當前的DependencyProperty值開始,因此它將平穩過渡。

+0

。謝謝 – 2011-04-19 15:01:42

12

故事板也可以使用ExitActionDataTrigger上停止,當約束值超出目標狀態時調用該故障板。只要給你的BeginStoryboard的名稱,並引用它在StopStoryboard行動,像這樣:

<DataTrigger.EnterActions> 
    <BeginStoryboard Name="your_storyboard_name"> 
     ... 
    </BeginStoryboard> 
</DataTrigger.EnterActions> 

<DataTrigger.ExitActions> 
    <StopStoryboard BeginStoryboardName="your_storyboard_name" /> 
</DataTrigger.ExitActions> 

這可能比啓動第二故事板,停止或掩蓋一個不同的故事板比較合適。

0

如果您需要重置在代碼背後的動畫你平時做這樣的呼籲:

MyControl.BeginAnimation(OpacityProperty, null); 

但如何根據MVVM做到在XAML?答案是:

<Style> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding Vanishing}" Value="True"> 
      <DataTrigger.EnterActions> 
       <BeginStoryboard> 
        <Storyboard TargetProperty="Opacity"> 
         <DoubleAnimation To="0" Duration="0:0:0.5" FillBehavior="Stop"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.EnterActions> 
      <DataTrigger.ExitActions> 
       <BeginStoryboard> 
        <Storyboard TargetProperty="Opacity"> 
         <DoubleAnimation To="{x:Null}" Duration="0:0:0"/> 
        </Storyboard> 
       </BeginStoryboard> 
      </DataTrigger.ExitActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

要撥打動畫視圖模型,我們可以這樣做:

Vanishing = true; 
await Task.Delay(500); 
Vanishing = false; 

還要確保綁定屬性(在我的情況下消失)調用INotifyPropertyChanged的通知有關新的價值觀點

它的工作原理是