2

属性绑定更改时如何开始情节提要?

我的图像源每 5 秒更改一次(在我的 ViewModel 中),我想在图像更改时播放故事板。

<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 来执行您的 Storyboard。

于 2012-08-19T15:49:41.880 回答