16

関連する質問をしました (受け入れられた回答付き): DataTrigger と Trigger を組み合わせる方法は?

私が求めているものを達成するには、 anEventTriggerと aを組み合わせる必要があると思います: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 がHighlight境界線の不透明度を 0 から 1 の間でアニメートし、アイテムが最初にロードされたときに再び元に戻り、ユーザーの注意を引くというものです。はDataTrigger、アニメーション化する回数を決定します。ビューモデルが項目を報告した場合IsCritical、アニメーションは 5.5 回発生し (不透明度 1 で終了)、それ以外の場合は 5 回発生します (不透明度 0 で終了します)。

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

「LoadedAnimation」という名前の子が VisualTree に見つかりません。

けっこうだ。では、カスタムの値コンバーターを使用したり、ビュー モデルにアニメーション カウントを配置してバインドしたりすることをためらう場合、どのような選択肢がありますか?

4

4 に答える 4

0

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

Storyboard を VisualState に抽出し、式ライブラリを使用して XAML 内で状態を切り替えます。Microsoft.Expression.Interactions ライブラリが必要です。WPF/Silverlight の状態 - XAML からアクティブ化しますか?も参照してください。

于 2014-05-08T16:17:12.510 に答える
0

コンバーターのアイデアに熱心ではないとおっしゃっていたのは承知していますが、Blend ソリューションにはライブラリをインストールする必要があるようです。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、 を取り外すことができます。

于 2015-11-07T15:50:41.857 に答える
-4

次のようなことを試してください:

<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>
于 2009-11-09T17:47:05.853 に答える