2009-11-05 149 views
14

注意我已要求相關的問題(與所接受的答案):How to combine DataTrigger and Trigger?如何結合DataTrigger和EventTrigger?

我想我需要一個EventTrigger結合和DataTrigger達到我所追求的:

  • 當一個項目出現在我的ListBox中時,它應該會閃爍片刻
  • 如果項目是'Critical',那麼它應該保持突出顯示

目前,我有一個DataTemplate,看起來像這樣:

<DataTemplate DataType="{x:Type Notifications:NotificationViewModel}"> 
    <Grid HorizontalAlignment="Stretch"> 
     <Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
     <Border Name="Highlight" CornerRadius="8" Background="Red"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
     <!-- snip actual visual stuff --> 
     <Grid.Triggers> 
      <EventTrigger RoutedEvent="Grid.Loaded"> 
       <EventTrigger.Actions> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation x:Name="LoadedAnimation" 
              Storyboard.TargetName="Highlight" 
              Storyboard.TargetProperty="Opacity" 
              From="0" To="1" 
              RepeatBehavior="5x" 
              Duration="0:00:0.2" 
              AutoReverse="True" /> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger.Actions> 
      </EventTrigger> 
     </Grid.Triggers> 
    </Grid> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding Path=IsCritical}" Value="True"> 
      <Setter TargetName="LoadedAnimation" Property="RepeatBehavior" Value="5.5x" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

的想法是,一個EventTrigger動畫的Highlight邊界的不透明度0和1之間,然後再返回反覆第一次加載項時,繪製用戶關注它。 DataTrigger確定動畫的次數。如果視圖模型報告項目IsCritical則動畫出現5.5次(使得它在不透明度1處結束),否則出現5次(在不透明度0處結束)。

然而,上述XAML不起作用,因爲DataTrigger的setter失敗:

在VisualTree中找不到名爲'LoadedAnimation'的子項。

不夠公平。因此,使用自定義值轉換器或將動畫放在視圖模型上並綁定到視圖模型時,我有什麼選擇?

+0

這可能是有幫助的http://stackoverflow.com/questions/2764415/how-to-give-the-condition-for-eventtrigger – 2014-01-23 12:35:54

回答

-3

嘗試這樣:

<Style x:Key="EventTriggerStyleKey"> 
    <Style.Triggers> 
    <EventTrigger RoutedEvent="some event here"> 
     <!-- your animation here --> 
    </EventTrigger> 
    <Style.Triggers> 
</Style> 

<Style x:Key="myStyleKey"> 
    <Style.Triggers> 
    <DataTrigger Binding="....." Value="......"> 
     <Setter Property="........." Value="......."/> 
     <Setter Property="Style" Value="{StaticResource EventTriggerStyleKey}"/> 
    </DataTrigger> 
    <Style.Triggers> 
</Style> 
+4

你試過嗎?這是我的經驗,你不能有一個風格設定風格。 – 2009-11-09 17:54:32

+1

您不能在樣式中設置樣式 – 2011-09-23 03:58:48

0

如果你有機會到混和SDK(你應該,如果你正在使用VS2012 +),你應該能夠在XAML完全做到這一點,像這樣的東西(免責聲明:未經測試):

<Grid HorizontalAlignment="Stretch"> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="NotificationStates"> 
      <VisualState x:Name="Flashing"> 
       <Storyboard> 
        <DoubleAnimation x:Name="LoadedAnimation" 
            Storyboard.TargetName="Highlight" 
            Storyboard.TargetProperty="Opacity" 
            From="0" To="1" 
            RepeatBehavior="5x" 
            Duration="0:00:0.2" 
            AutoReverse="True" /> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="Normal" /> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <Border Name="Background" CornerRadius="8" Background="#80c0c0c0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
    <Border Name="Highlight" CornerRadius="8" Background="Red"  HorizontalAlignment="Stretch" VerticalAlignment="Stretch" /> 
    <!-- snip actual visual stuff --> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <ic:GoToStateAction StateName="Flashing"/> 
     </i:EventTrigger> 
     <ie:DataTrigger Binding="{Binding Path=IsCritical}" Value="True"> 
      <ic:GoToStateAction StateName="Flashing"/> 
     </ie:DataTrigger> 
    </i:Interaction.Triggers> 
</Grid> 

提取你的故事板到的VisualState,然後使用表達式庫的XAML中切換狀態。您需要Microsoft.Expression.Interactions庫,另請參閱WPF/Silverlight States - Activate from XAML?

0

在這種情況下,我將使用行爲而不是觸發器。您可以編寫一個行爲,將事件處理程序附加到關聯的對象的加載事件,然後應用動畫。該行爲可能會暴露一些屬性,我會公開一個AnimationCount(int)屬性,該屬性告訴行爲有多少時間在與其關聯的元素上重複動畫。然後,您可以將此屬性設置爲IsCritical屬性綁定在視圖模型,並使用值轉換器轉換成假以5和真實的5.5

希望這有助於

0

我知道你說你不熱衷於一個轉換器的想法,但它看起來像混合解決方案需要安裝一個庫。該轉換器是沒有太多的工作和信號的意圖,房價是直接依賴於IsCritical屬性:

public class CriticalAnimationRateConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     // Error handling omitted for brevity. 
     if ((bool)value) 
      return new System.Windows.Media.Animation.RepeatBehavior(5.5); 
     else 
      return new System.Windows.Media.Animation.RepeatBehavior(5.0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

,然後更新您的動畫:

<DoubleAnimation Storyboard.TargetName="Highlight" 
       Storyboard.TargetProperty="Opacity" 
       From="0" 
       To="1" 
       RepeatBehavior="{Binding IsCritical, Converter={StaticResource CriticalAnimationRateConverter}}" 
       Duration="0:00:0.2" 
       AutoReverse="True" /> 

DataTrigger然後可以去除。