属性绑定更改时如何开始情节提要?
我的图像源每 5 秒更改一次(在我的 ViewModel 中),我想在图像更改时播放故事板。
<Grid>
<Image x:Name="image" Source="{Binding CurrentImage}"/>
</Grid>
属性绑定更改时如何开始情节提要?
我的图像源每 5 秒更改一次(在我的 ViewModel 中),我想在图像更改时播放故事板。
<Grid>
<Image x:Name="image" Source="{Binding CurrentImage}"/>
</Grid>
您通常会为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>
我认为您最好在 ViewModel 中添加一个事件,并在源更改时启动它。当然,在该事件上使用 EventTrigger 来执行您的 Storyboard。