任何数据(绑定)更改时的WPF数据触发器
每当我的图像源改变时,我想开始一个故事板。 我已实现INotifyPropertyChanged 有人能帮我做到这一点吗 谢谢任何数据(绑定)更改时的WPF数据触发器,wpf,binding,Wpf,Binding,每当我的图像源改变时,我想开始一个故事板。 我已实现INotifyPropertyChanged 有人能帮我做到这一点吗 谢谢 <Image Name="pic" HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding ElementName=uc, Path=Image}"> <Image.Resources> <Storyboard
<Image Name="pic" HorizontalAlignment="Center" VerticalAlignment="Center" Source="{Binding ElementName=uc, Path=Image}">
<Image.Resources>
<Storyboard x:Key="picStory" x:Name="picStory">
<DoubleAnimation
Storyboard.TargetProperty="(Image.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)"
From="0" To="20" Duration="0:0:0.7" />
<DoubleAnimation Storyboard.TargetProperty="(Image.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)" From="100" To="0" Duration="0:0:0.7" />
</Storyboard>
</Image.Resources>
<Image.Style>
<Style TargetType="{x:Type Image}" BasedOn="{StaticResource {x:Type Image}}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=Source}">
<DataTrigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource picStory}"/>
</DataTrigger.EnterActions>
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
<Image.RenderTransform>
<TransformGroup>
<RotateTransform/>
<TranslateTransform/>
</TransformGroup>
</Image.RenderTransform>
</Image>
您可以通过另一种简单的方式实现这一点,方法是构建一个非常基本的自定义控件,该控件继承自Image 这里是“MyImage”的代码: MyImage控件有自己的image source属性和一个名为“ImageUpdated”的路由事件,该事件稍后将触发情节提要。我已简化了您的图像代码:
<Button Click="Button_Click" Grid.Row="0">Set Image through view model</Button>
<local:MyImage Grid.Row="1" x:Name="pic" MyImageSource="{Binding MySource}">
<Image.Triggers>
<EventTrigger RoutedEvent="local:MyImage.ImageUpdated">
<BeginStoryboard >
<Storyboard >
<DoubleAnimation Storyboard.TargetProperty="(Image.Opacity)" From="0" To="1" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Image.Triggers>
</local:MyImage>
viewmodel中的setter使用属性更改模式更新MyImage:
public ImageSource MySource
{
get { return _mySource; }
set
{
_mySource = value;
RaisePropertyChanged("MySource");
}
}
在我的示例中,“不透明度”属性已设置动画
希望这有帮助
Jan您的DataTrigger中没有定义值标记 DataTrigger正在侦听更新以查找您在value标记中定义的值-因为您没有设置它-它默认为null(我猜您的图像永远不会为null)
如果您想让它在每次更改时都触发—只需在绑定标记中放置一个valueconverter,该标记始终返回True并设置Value=“True”。您能否解释一下实现了
INotifyPropertyChanged
?您没有显示任何代码,并且您的图像源绑定到您正在显示的XAML之外的名为uc
的东西。嗨,Jay,我已经添加了您请求的代码。但是这不是问题,我看到图像发生了变化,但是故事板没有被激活。你确定这会起作用吗?我试过了,很明显,如果值不变,触发器将不会触发-即,它会在第一次设置为True时触发,但不会在任何连续设置上触发。。。
<Button Click="Button_Click" Grid.Row="0">Set Image through view model</Button>
<local:MyImage Grid.Row="1" x:Name="pic" MyImageSource="{Binding MySource}">
<Image.Triggers>
<EventTrigger RoutedEvent="local:MyImage.ImageUpdated">
<BeginStoryboard >
<Storyboard >
<DoubleAnimation Storyboard.TargetProperty="(Image.Opacity)" From="0" To="1" Duration="0:0:1" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Image.Triggers>
</local:MyImage>
private void Button_Click(object sender, RoutedEventArgs e)
{
int randomValue = new Random(DateTime.Now.Second).Next(0, 2);
if (randomValue == 0)
{
_viewModel.MySource = new BitmapImage(new Uri(@"test.bmp", UriKind.Relative));
}
else
{
_viewModel.MySource = new BitmapImage(new Uri(@"test2.bmp", UriKind.Relative));
}
}
public ImageSource MySource
{
get { return _mySource; }
set
{
_mySource = value;
RaisePropertyChanged("MySource");
}
}