EventSetter使用和作用
1、只有Style.Setter支持EventSetter其它方式不支持。
2、EventSetter不能在包含ResourceDictionary的主题当中。这也就是在一个单独的
Dictionary.xaml中定义的Style中无法设置EventSetter,比如自定义控件就无法设置EventSetter,因为自定义控件的Style定义在themes/generic.xaml文件中。所以EventSetter最好只在window.xaml、page.xaml、自定义用户控件中使用。
3、EventSetter可以通过BaseOn方式继承。
4、EventSetter作用,通过EventSetter定义事件响应,那么所有继承了该Style的控件都可以拥有该事,而不用每个控件另外额外重复定义相同的事件,这样可以减少代码量。
比如我们自定义一个用户控件EventSetUserControl其中xaml文件如下
<UserControl.Resources>
<Style TargetType="TextBlock">
<Setter Property="Margin" Value="5"/>
<EventSetter Event="MouseLeftButtonUp" Handler="TextBlock_MouseLeftButtonUpByEventSetter"/>
</Style>
</UserControl.Resources>
<Grid Background="AliceBlue">
<StackPanel Orientation="Vertical">
<TextBlock Text="点击我" Width="100" Height="50" Background="Yellow" MouseLeftButtonUp="TextBlock_MouseLeftButtonUp"/>
<TextBlock Text="点击我" Width="100" Height="50" Background="Yellow"/>
</StackPanel>
</Grid>
说明:该用户控件EventSetUserControl定义了一个TextBlock的隐式Style,并且为TextBlock设置了一个EentSetter,
第一个TextBlock点击时候有两个响应,
一个是TextBlock_MouseLeftButtonUp,
另外一个是TextBlock_MouseLeftButtonUpByEventSetter,响应顺序为TextBlock_MouseLeftButtonUp->TextBlock_MouseLeftButtonUpByEventSetter
如果TextBlock_MouseLeftButtonUp中设置了e.Handled=true,那么事件TextBlock_MouseLeftButtonUpByEventSetter不会触发。
第二个TextBlock由于通过隐式设置了一个EventSetter,那么点击该TextBlock也会触发事件TextBlock_MouseLeftButtonUpByEventSetter