在Style中将EventTrigger与Trigger同时使用
2011-07-12 14:52
197 查看
现在在看WPF关于Trigger的有关实例,然后找到一篇不错的文章,特此转载,收藏一下!! 一般情况下,使用Style时,可以对ControlTemplate添加Triggers,既可以添加EventTrigger,又可以Trigger。 但无论如何,在Triggers节点下,是无法同时添加EventTrigger与Trigger复合条件的。拿RadioButton为例,在非选中状态下,MouseEnter与MouseLeave会触发颜色变化事件;在选中状态下,可能又不需要这样的事件。那如何判断MouseEnter与MouseLeave时,到底是选中还是非选中状态呢? 以下是非选中状态下的ControlTemplate定义: <ControlTemplate x:Key="UnCheckedImageRadioButtonTemplate"
TargetType="{x:Type style:ImageRadioButton}">
<Grid x:Name="grdButton">
<Image x:Name="PART_OVER_img"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Opacity="0"
Source="{Binding Path=ImageOver, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" />
<Image Name="PART_img"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Source="{Binding Path=ImageNormal, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" />
</Grid> <ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter"
SourceName="PART_img">
<BeginStoryboard Storyboard="{StaticResource stbFadeIn}" />
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave"
SourceName="PART_img">
<BeginStoryboard Storyboard="{StaticResource stbFadeOut}" />
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseUp"
SourceName="PART_img">
<BeginStoryboard Storyboard="{StaticResource stbFadeIn}" />
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseDown"
SourceName="PART_img">
<BeginStoryboard Storyboard="{StaticResource stbFadeOut}" />
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate> 这里,我定义了MouseEnter,MouseLeave,MouseUp和MouseDown事件时触发的Storyboard。但要如何判断这些事件触发时,到底是选中还是非选中呢?我最开始尝试使用MultiTrigger,可MultiTrigger中不能定义EventTrigger,因此不能同时判断MouseEnter事件与选中状态。 下面列出了Style的定义,通过Style定义,可以巧妙的将选中属性的判断,定义在ControlTemplate以外。 <Style TargetType="{x:Type style:ImageRadioButton}">
<Setter Property="Focusable"
Value="False" />
<Setter Property="Cursor"
Value="Hand" />
<Style.Triggers>
<Trigger Property="IsChecked"
Value="True">
<Setter Property="Template"
Value="{StaticResource CheckedImageRadioButtonTemplate}" />
</Trigger>
<Trigger Property="IsChecked"
Value="False">
<Setter Property="Template"
Value="{StaticResource UnCheckedImageRadioButtonTemplate}" />
</Trigger>
</Style.Triggers>
</Style> 红色字体的部分,就是在Style中,先对选中状态进行的判断,然后ControlTemplate中不需要再同时判断选中状态与MouseEnter事件。然后将先前定义的包含Triggers定义的ControlTemplate简化一下,得到不需要检测EventTrigger的模板。 <ControlTemplate x:Key="CheckedImageRadioButtonTemplate"
TargetType="{x:Type style:ImageRadioButton}">
<Grid x:Name="grdButton">
<Image x:Name="PART_OVER_img"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Source="{Binding Path=ImageOver, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" />
</Grid>
</ControlTemplate> 顺利完成!这样就可以解决EventTrigger与Trigger同时使用的问题了。希望对大家有所帮助!
TargetType="{x:Type style:ImageRadioButton}">
<Grid x:Name="grdButton">
<Image x:Name="PART_OVER_img"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Opacity="0"
Source="{Binding Path=ImageOver, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" />
<Image Name="PART_img"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Source="{Binding Path=ImageNormal, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" />
</Grid> <ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter"
SourceName="PART_img">
<BeginStoryboard Storyboard="{StaticResource stbFadeIn}" />
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseLeave"
SourceName="PART_img">
<BeginStoryboard Storyboard="{StaticResource stbFadeOut}" />
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseUp"
SourceName="PART_img">
<BeginStoryboard Storyboard="{StaticResource stbFadeIn}" />
</EventTrigger>
<EventTrigger RoutedEvent="Mouse.MouseDown"
SourceName="PART_img">
<BeginStoryboard Storyboard="{StaticResource stbFadeOut}" />
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate> 这里,我定义了MouseEnter,MouseLeave,MouseUp和MouseDown事件时触发的Storyboard。但要如何判断这些事件触发时,到底是选中还是非选中呢?我最开始尝试使用MultiTrigger,可MultiTrigger中不能定义EventTrigger,因此不能同时判断MouseEnter事件与选中状态。 下面列出了Style的定义,通过Style定义,可以巧妙的将选中属性的判断,定义在ControlTemplate以外。 <Style TargetType="{x:Type style:ImageRadioButton}">
<Setter Property="Focusable"
Value="False" />
<Setter Property="Cursor"
Value="Hand" />
<Style.Triggers>
<Trigger Property="IsChecked"
Value="True">
<Setter Property="Template"
Value="{StaticResource CheckedImageRadioButtonTemplate}" />
</Trigger>
<Trigger Property="IsChecked"
Value="False">
<Setter Property="Template"
Value="{StaticResource UnCheckedImageRadioButtonTemplate}" />
</Trigger>
</Style.Triggers>
</Style> 红色字体的部分,就是在Style中,先对选中状态进行的判断,然后ControlTemplate中不需要再同时判断选中状态与MouseEnter事件。然后将先前定义的包含Triggers定义的ControlTemplate简化一下,得到不需要检测EventTrigger的模板。 <ControlTemplate x:Key="CheckedImageRadioButtonTemplate"
TargetType="{x:Type style:ImageRadioButton}">
<Grid x:Name="grdButton">
<Image x:Name="PART_OVER_img"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Source="{Binding Path=ImageOver, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" />
</Grid>
</ControlTemplate> 顺利完成!这样就可以解决EventTrigger与Trigger同时使用的问题了。希望对大家有所帮助!
相关文章推荐
- 使用FastClick的同时造成元素上的trigger('click')无法触发的解决办法
- sql server 2012 merge的使用,同构表merger,异构表merge, 当merge 与trigger 同时使用时较容易出错
- overridePendingTransition和FLAG_ACTIVITY_REORDER_TO_FRONT同时使用时,没有Activity启动动画
- Android下同时使用WIFI与移动网络时保证优先使用移动网络
- validator 和 datepicker同时使用时的小Bug
- 当局域网内某台主机使用P2P进行下载时,P2P软件会占用局域网到互联网出口的大量的带宽,导致其他用户网速慢、卡等现象。BT等软件在下载的同时又作为种子为其他人提供下载服务
- 关于同时使用MacVim和zsh产生PATH读取错误的解决办法
- 使用jdb和gdb同时调试java native code
- Merge into使用详解( 同时执行inserts和updates操作 )
- app放大缩小,同时左右切换页面。插件pinchzoom.js在iscroll和swipper中使用
- vsftpd同时使用系统用户和虚拟用户验证
- Spring中使用CronTrigger进行任务调度
- 使用IDropTarget接口同时支持文本和文件拖放(一)
- 经亲自实验,一台Windows电脑,同时接入2个USB鼠标和2个USB键盘,均可正常使用。
- Gridview使用CheckBox全选与单选采用js实现同时高亮显示选择行
- sql中同一个Trigger里同时包含Insert,Update,Delete
- Servlet中PrintWriter和OutputStream两个流不能同时使用
- focus、blur、change、one、trigger、unbind 事件的使用
- MySQL中group by和order by同时使用