WPF DataTrigger上的任何数据(绑定)的变化 [英] WPF DataTrigger on any data (binding) change
问题描述
我要开始一个故事板,每次我的图片来源变化。
我已经实现INotifyPropertyChanged的。
谁能帮我实现这一目标?
谢谢,
<图像NAME =图片的HorizontalAlignment =中心VerticalAlignment =中心来源={绑定的ElementName = UC,路径=图片}>
< Image.Resources>
<情节提要X:键=picStoryX:NAME =picStory>
< DoubleAnimation是
Storyboard.TargetProperty=\"(Image.RenderTransform).(TransformGroup.Children)[0].(RotateTransform.Angle)\"
从=0要=20工作持续时间=0:0:0.7/>
< DoubleAnimation是Storyboard.TargetProperty=\"(Image.RenderTransform).(TransformGroup.Children)[1].(TranslateTransform.Y)\"从=100为了=0时长=0:0:0.7/>
< /故事板>
< /Image.Resources>
< Image.Style>
<风格的TargetType ={X:输入图像}支持算法FMP ={StaticResource的{X:输入图像}}>
< Style.Triggers>
< DataTrigger绑定={绑定路径=源}>
< DataTrigger.EnterActions>
< BeginStoryboard故事板={StaticResource的picStory}/>
< /DataTrigger.EnterActions>
< / DataTrigger>
< /Style.Triggers>
< /样式和GT;
< /Image.Style>
< Image.RenderTransform>
<&的TransformGroup GT;
< RotateTransform />
< TranslateTransform />
< /&的TransformGroup GT;
< /Image.RenderTransform>
< /图像>
code绑定到UC
私人BitmapImage的形象;
公众形象的BitmapImage
{
{返回形象; }
组
{
图像=价值;
OnPropertyChanged(图像);
}
} 公共事件PropertyChangedEventHandler的PropertyChanged;
保护无效OnPropertyChanged(字符串propertyName的)
{
如果(!=的PropertyChanged空)的PropertyChanged(这一点,新System.ComponentModel.PropertyChangedEventArgs(propertyName的));
}
您可以通过建立一个非常基本的自定义的控制,从图像会继承另一种简单的方式实现这一目标。
在这里,code为MYIMAGE
公共类MYIMAGE:图片
{
公共静态只读RoutedEvent ImageUpdatedEvent =
EventManager.RegisterRoutedEvent(ImageUpdated,RoutingStrategy.Bubble的typeof(RoutedEventHandler)的typeof(MYIMAGE)); 公共事件RoutedEventHandler ImageUpdated
{
添加{this.AddHandler(ImageUpdatedEvent,值); }
除去{this.RemoveHandler(ImageUpdatedEvent,值); }
} 公共静态只读的DependencyProperty MyImageSourceProperty = DependencyProperty.Register(
MyImageSource
typeof运算(的ImageSource)
typeof运算(MYIMAGE)
新PropertyMetadata(空,新PropertyChangedCallback(OnMyImageSourceChanged))); 公众的ImageSource MyImageSource
{
{返回(ImageSource的)的GetValue(MyImageSourceProperty); }
组
{
来源=价值;
的SetValue(MyImageSourceProperty,值);
}
} 私有静态无效OnMyImageSourceChanged(OBJ的DependencyObject,DependencyPropertyChangedEventArgs参数)
{
MYIMAGE IMG = OBJ为MYIMAGE;
img.Source = args.NewValue为ImageSource的;
img.RaiseEvent(新RoutedEventArgs(ImageUpdatedEvent));
}
}
该MYIMAGE控制有它自己的图像源属性和名为ImageUpdated一个自己的路由事件,这将导致以后的故事板被triggerd。我已经简化了您的图像code:
<按钮点击=Button_ClickGrid.Row =0>通过视图模型&LT设置图像; /按钮> <局部:MYIMAGE Grid.Row =1×:NAME =PICMyImageSource ={结合MYSOURCE}>
< Image.Triggers>
<的EventTrigger RoutedEvent =本地:MyImage.ImageUpdated>
< BeginStoryboard>
<情节提要>
&所述; DoubleAnimation是Storyboard.TargetProperty =(Image.Opacity)从=0要=1持续时间=0:0:1/>
< /故事板>
< / BeginStoryboard>
< /&的EventTrigger GT;
< /Image.Triggers>
< /地方:MYIMAGE>
按钮设置绑定视图模型的图像源属性,它实现INotifyPropertyChanged一个新值:
私人无效Button_Click(对象发件人,RoutedEventArgs E)
{
INT randomValue =新随机(DateTime.Now.Second)。接下来(0,2); 如果(randomValue == 0)
{
_viewModel.MySource =新的BitmapImage(新的URI(@TEST.BMP,UriKind.Relative));
}
其他
{
_viewModel.MySource =新的BitmapImage(新的URI(@test2.bmp,UriKind.Relative));
}
}
在视图模型的二传手更新MYIMAGE财产变模式:
公开的ImageSource MYSOURCE
{
{返回_mySource; }
组
{
_mySource =价值;
RaisePropertyChanged(MYSOURCE);
}
}
在我的例子,不透明度属性动画。
希望这是有帮助的。
月
I want to begin a storyboard, every time my Image source changes. I have implemented INotifyPropertyChanged.
Can anyone help me achieve this?
Thanks,
<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>
Code bound to "uc":
private BitmapImage image;
public BitmapImage Image
{
get { return image; }
set
{
image = value;
OnPropertyChanged("Image");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null) PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
you can achieve this in another simple way by building a very basic custom control, which inherits from Image.
Here the code for "MyImage":
public class MyImage : Image
{
public static readonly RoutedEvent ImageUpdatedEvent =
EventManager.RegisterRoutedEvent("ImageUpdated", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyImage));
public event RoutedEventHandler ImageUpdated
{
add { this.AddHandler(ImageUpdatedEvent, value); }
remove { this.RemoveHandler(ImageUpdatedEvent, value); }
}
public static readonly DependencyProperty MyImageSourceProperty = DependencyProperty.Register(
"MyImageSource",
typeof(ImageSource),
typeof(MyImage),
new PropertyMetadata(null, new PropertyChangedCallback(OnMyImageSourceChanged)));
public ImageSource MyImageSource
{
get { return (ImageSource)GetValue(MyImageSourceProperty); }
set
{
Source = value;
SetValue(MyImageSourceProperty, value);
}
}
private static void OnMyImageSourceChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
MyImage img = obj as MyImage;
img.Source = args.NewValue as ImageSource;
img.RaiseEvent(new RoutedEventArgs(ImageUpdatedEvent));
}
}
The MyImage control has it's own image source property and an own routed event called "ImageUpdated", which will later cause the storyboard to be triggerd. I have simplified your image code:
<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>
The button sets a new value for the image source property of the bound viewmodel, which implements INotifyPropertyChanged:
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));
}
}
The setter in the viewmodel updates the MyImage with property changed pattern:
public ImageSource MySource
{
get { return _mySource; }
set
{
_mySource = value;
RaisePropertyChanged("MySource");
}
}
In my example, the opacity property is animated.
Hope this was helpful
Jan
这篇关于WPF DataTrigger上的任何数据(绑定)的变化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!