2

プロパティバインディングが変更されたときにストーリーボードを開始するにはどうすればよいですか?

画像のソースは(ViewModelで)5秒ごとに変更され、画像が変更されたときにストーリーボードを再生したいと思います。

<Grid>
   <Image x:Name="image" Source="{Binding CurrentImage}"/>       
</Grid>
4

2 に答える 2

3

Source通常、プロパティが変更されるたびに発生するイベントにEventTriggerを追加します。残念ながら、Imageコントロールはそのようなイベントを定義していないため、Imageから派生して独自のイベントを作成する必要があります。

public class MyImage : Image
{
    public static readonly RoutedEvent SourceChangedEvent = EventManager.RegisterRoutedEvent(
        "SourceChanged", RoutingStrategy.Direct, typeof(RoutedEventHandler), typeof(MyImage));

    static MyImage()
    {
        Image.SourceProperty.OverrideMetadata(typeof(MyImage), new FrameworkPropertyMetadata(SourcePropertyChanged));
    }

    public event RoutedEventHandler SourceChanged
    {
        add { AddHandler(SourceChangedEvent, value); }
        remove { RemoveHandler(SourceChangedEvent, value); }
    }

    private static void SourcePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        Image image = obj as Image;
        if (image != null)
        {
            image.RaiseEvent(new RoutedEventArgs(SourceChangedEvent));
        }
    }
}

SourceChangedこれで、EventTriggerでイベントを使用できます。

<local:MyImage Source="{Binding Image}">
    <local:MyImage.Triggers>
        <EventTrigger RoutedEvent="local:MyImage.SourceChanged">
            <BeginStoryboard>
                <Storyboard>
                    ...
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </local:MyImage.Triggers>
</local:MyImage>
于 2012-08-19T16:26:46.117 に答える
1

ViewModelにイベントを追加し、ソースが変更されるたびにそれを起動する方がよいと思います。そしてもちろん、そのイベントでEventTriggerを使用して、ストーリーボードを実行します。

于 2012-08-19T15:49:41.880 に答える