2009-11-05 26 views
14

NOTEは、私が(受け入れ答えで)関連の質問をしていますHow to combine DataTrigger and Trigger?DataTriggerとEventTriggerを組み合わせるにはどうすればいいですか?

は私がEventTriggerを結合する必要があると思うとDataTriggerは、私は何を達成するために後:

  • アイテムがリストボックスに表示されると、しばらくの間点滅する必要があります
  • アイテムが「クリティカル」の場合はハイライト表示のままにしてください

は現在、私はこのようになりますの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は、アイテムが最初にロードされるときに、描画を繰り返し再び0と1の間のHighlight境界線の不透明度をアニメーション化していることですユーザーの注意を喚起する。 DataTriggerは、アニメートする回数を決定します。ビューモデルで項目IsCriticalが報告された場合、アニメーションは5.5回(不透明度1で終了する)、それ以外の場合は5回(不透明度0で終わる)表示されます。

ただし、上記のXAMLは機能しませんDataTriggerのセッターが失敗します。

名前が 'LoadedAnimation'の子がVisualTreeに見つかりません。

かなり十分です。ですから、カスタム値コンバーターを使用したり、アニメーションカウントをビューモデルに入れてバインドしたりするのは恥ずかしいですが、私の選択肢は何ですか?

+0

役立つかもしれないhttp://stackoverflow.com/questions/2764415/how-to-give-the-condition-for-eventtrigger –

答えて

-3

このような何か試してください:あなたがブレンドSDK(あなたはVS2012の+を使用している場合、あなたがしなければならない)へのアクセス権を持っている場合、あなたはこのようなもので、XAMLで完全にこれを達成することができるはず

<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

これを試しましたか?私の経験では、スタイルを設定するスタイルを持つことはできません。 –

+1

スタイル内でスタイルを設定することはできません –

0

を(免責事項:未テスト):

<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> 

はその後、XAML内の状態を切り替えるために発現ライブラリーを使用し、visualSTATEのにあなたのストーリーボードを抽出します。 WPF/Silverlight States - Activate from XAML?

0

この場合は、トリガーの代わりに動作を使用します。これは、Microsoft.Expression.Interactionsライブラリを参照してください。イベントハンドラを関連付けられたオブジェクトのloadイベントに関連付けてアニメーションを適用するビヘイビアを記述できます。このビヘイビアではいくつかのプロパティが公開されている可能性があります。関連付けられているエレメントでアニメーションを何回繰り返すかをビヘイビアに示すAnimationCount(int)プロパティが公開されます。あなたは、これは私はあなたがに熱心ではないと述べた知って

0

を助けビューモデルにIsCriticalプロパティにこのプロパティをバインドし、5.5

希望に5に偽と真の変換するために、値コンバータを使用することができますコンバーターのアイディアですが、Blendソリューションではライブラリをインストールする必要があります。

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(); 
    } 
} 

そしてアニメーション更新:コンバータはレートがIsCriticalプロパティに直接依存していることを多くの仕事や信号の意図ではありませんDataTriggerを除去することができ

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

を。