码迷,mamicode.com
首页 > Windows程序 > 详细

WPF中Button类行为小记

时间:2015-08-13 01:07:32      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

今天学习WPF控制类模版,尝试自写模版控制自定义Button类视觉效果时遇到一坑,记录如下。

 

情景:

尝试通过将Button.Template属性设置为自定义的Control Template,以控制该Button的视觉效果。

 

问题:

使用该Control Template后,模版中为按下按键及弹起按键所设的EventTrigger无效。

技术分享
1 <ControlTemplate.Triggers>
2     <EventTrigger RoutedEvent="MouseLeftButtonDown">
3         ...
4     </EventTrigger>
5     <EventTrigger RoutedEvent="MouseLeftButtonUp">
6         ...
7     </EventTrigger>
8     ...
9 </ControlTemplate.Triggers>
View Code

 

Trouble Shooting:

1‘  为该Button的MouseLeftButtonDownMouseLeftButtonUp事件添加回调函数,发现该Button的这两个事件并不开火。

2‘  为使用WPF默认模版ButtonMouseLeftButtonDownMouseLeftButtonUp事件添加回调函数,发现事件仍不开火。

3‘  在StackOverFlow发现,当基类ButtonBaseClickModeProperty的值被设置为ClickMode.Press或ClickMode.Release(默认)时,这两个事件的EventArgs会被该按钮的Click事件处理机制捕获并抑制,造成所述的RoutedEvent哑火。只有在将ClickModeProperty设置为ClickMode.Hover时,所述事件才会正常开火。经过调整后,上述代码果然得以正常运行。

4‘  那么有没有办法在保留ClickModeProperty默认值(此值下的Click事件的行为通常证实我们需要的)的情况下,在模版中个性化按下按钮与取消按下时的视觉效果呢?注意到Button类的默认模版实现了这一功能,然而通过反射查看其Xaml文件并没有得到更多有用的信息。默认模版将Heavy work丢给了相应的Chrome类。

5‘  最后才注意到,ButtonBase提供了名为IsPressed的属性,描述是,「获取一个值,该值标识ButtonBase当前是否被激活」。修改代码,将相应动画添加至绑定到该属性的Trigger下:

 1 <Trigger Property="IsPressed" Value="True">
 2                     <Trigger.EnterActions>
 3                         <BeginStoryboard>
 4                             <Storyboard>
 5                                 <ColorAnimation Duration="0:0:0.1"
 6                                              Storyboard.TargetName="border"
 7                                              Storyboard.TargetProperty="Background.Color"
 8                                               To="#1177cc" />
 9                             </Storyboard>
10                         </BeginStoryboard>
11                     </Trigger.EnterActions>
12                     <Trigger.ExitActions>
13                         <BeginStoryboard>
14                             <Storyboard>
15                                 <ColorAnimation Duration="0:0:0.15"
16                                              Storyboard.TargetName="border"
17                                              Storyboard.TargetProperty="Background.Color"/>
18                             </Storyboard>
19                         </BeginStoryboard>
20                     </Trigger.ExitActions>
21                 </Trigger>

测试发现动画成功生效。

 

WPF中Button类行为小记

标签:

原文地址:http://www.cnblogs.com/luxkodev/p/4725960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!