4

私の問題:

DoubleAnimation の Completed を処理しようとすると、アニメーションが DataTrigger によって開始された場合でも、イベントは発生しません。ビューモデルから開始する必要があるため、データトリガーでイベントを開始しています。Completed イベントが EventTrigger (ボタン クリックなど) に対して発生することがわかりました。そこで、ダブルアニメーションの Completed イベントが別のイベント (ボタン クリック) によってトリガーされたときに発生するが、データトリガーによってトリガーされたときには発生しないことを示す簡単な例を作成しました。これはなぜですか、また、この動作を回避するにはどうすればよいですか?

私の動機(これはスキップできます)

3 つの異なる状態を持つコントロールを作成しようとしています。コントロールが状態に入ると、アニメーションを実行したいと思います。アニメーションを複数回繰り返すのに苦労しています。これは、アニメーションが削除されるまでアニメーションのプロパティに作用し続けるためです。アニメーションを削除するために、アニメーションの完了イベントのイベント ハンドラーを作成したいと考えていました。ただし、このイベントは発火していませんでした。

私のXaml

<Window x:Class="AnimationTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

<Window.Resources>
    <DataTemplate x:Key="Control">

        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding State}" Value="On">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation
                                Storyboard.TargetName="txtMessage"
                                Storyboard.TargetProperty="Opacity"
                                From="1.0" To="0.0" Duration="0:0:5"
                                Completed="DataTriggerAnimation_Completed" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger>
        </DataTemplate.Triggers>

        <DockPanel HorizontalAlignment="Center">
            <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal">
                <Button Content="Start Event Animation" x:Name="Button1" >
                    <Button.Background>
                        <SolidColorBrush x:Name="Button1BackgroundBrush" Color="Red" />
                    </Button.Background>
                    <Button.Triggers>
                        <EventTrigger RoutedEvent="Button.Click">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation
                                Storyboard.TargetName="txtMessage"
                                Storyboard.TargetProperty="Opacity"
                                From="1.0" To="0.0" Duration="0:0:5"
                                FillBehavior="HoldEnd"
                                Completed="EventTriggerAnimation_Completed" />
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Button.Triggers>
                </Button>

                <Button Content="Data Animation" Click="Button_Click" />
            </StackPanel>

            <TextBlock x:Name="txtMessage" Text="{Binding Message}" />
        </DockPanel>
    </DataTemplate>
</Window.Resources>

<ContentPresenter ContentTemplate="{StaticResource Control}" Content="{Binding}" />

</Window>

コードビハインド

public partial class MainWindow : Window
{
    private MainWindowViewModel vm;

    public MainWindow()
    {
        InitializeComponent();

        vm = new MainWindowViewModel();
        this.DataContext = vm;
    }

    private void DataTriggerAnimation_Completed(object sender, EventArgs e)
    {
        Console.WriteLine("Data Trigger Completed");
    }

    private void EventTriggerAnimation_Completed(object sender, EventArgs e)
    {
        Console.WriteLine("Event Trigger Completed");
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        vm.State = MainWindowViewModel.States.On;
    }
}

私のViewModel

class MainWindowViewModel : INotifyPropertyChanged
{
    private const string message = "This message is visible";

    public string Message
    {
        get { return message; }
    }

    private States state;

    public States State
    {
        get { return state; }
        set 
        { 
            state = value;
            OnPropertyChanged("State");
        }
    }

    public enum States
    {
        Off,
        On
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }

    #endregion
}

プロジェクトをダウンロードしたい場合は、こちらからhttps://dl.dropboxusercontent.com/u/104667143/AnimationTest.zip

4

0 に答える 0