标签:
今天学习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>
1‘ 为该Button的MouseLeftButtonDown及MouseLeftButtonUp事件添加回调函数,发现该Button的这两个事件并不开火。
2‘ 为使用WPF默认模版Button的MouseLeftButtonDown及MouseLeftButtonUp事件添加回调函数,发现事件仍不开火。
3‘ 在StackOverFlow发现,当基类ButtonBase的ClickModeProperty的值被设置为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>
测试发现动画成功生效。
标签:
原文地址:http://www.cnblogs.com/luxkodev/p/4725960.html