プロパティバインディングが変更されたときにストーリーボードを開始するにはどうすればよいですか?
画像のソースは(ViewModelで)5秒ごとに変更され、画像が変更されたときにストーリーボードを再生したいと思います。
<Grid>
<Image x:Name="image" Source="{Binding CurrentImage}"/>
</Grid>
プロパティバインディングが変更されたときにストーリーボードを開始するにはどうすればよいですか?
画像のソースは(ViewModelで)5秒ごとに変更され、画像が変更されたときにストーリーボードを再生したいと思います。
<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を使用して、ストーリーボードを実行します。