原文: 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客: 2,000 Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。很希望能够分享给大家。
本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。
在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。
前文可以翻阅本博客wpf标签的文章。
[ 小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源: 小九的学堂 。 cnblogs.com/xfuture ]
#63 Trigger触发后的属性改变可以自动重置
当Trigger改变了一个属性的值后,如果Trigger中的判断不再为true的时候,该属性会自动重置为初始值。
例子:对一个button mouse over的时候你设置其有dropshadoweffect,而当你离开该button的时候就会回复其原始状态。
<
Window.Resources
>
<
Style
x:Key
=
"hoverStyle"
TargetType
=
"Button"
>
<
Style.Triggers
>
<
Trigger
Property
=
"IsMouseOver"
Value
=
"true"
>
<
Setter
Property
=
"Button.Effect"
>
<
Setter.Value
>
<
DropShadowEffect
/>
</
Setter.Value
>
</
Setter
>
</
Trigger
>
</
Style.Triggers
>
</
Style
>
</
Window.Resources
>
<
StackPanel
Orientation
=
"Horizontal"
HorizontalAlignment
=
"Center"
>
<
Button
Content
=
"Run"
Height
=
"23"
Width
=
"75"
Style
=
"{StaticResource hoverStyle}"
/>
<
Button
Content
=
"Skip"
Height
=
"23"
Width
=
"75"
Style
=
"{StaticResource hoverStyle}"
/>
<
Button
Content
=
"Jump"
Height
=
"23"
Width
=
"75"
Style
=
"{StaticResource hoverStyle}"
/>
</
StackPanel
>
#64 Wpf所支持的三种Triggers
Wpf支持三种不同种类的Triggers:
<1>. Property trigger,
1. 当依赖属性改变时触发,
2. 使用属性名字来定制,
3. 包含Setter元素,来赋予一个或者多个依赖属性触发器,当Trigger处于active状态或者处于inactive状态时,可以触发一个或者多个TriggerAction.
<2>. Data trigger,
1. 当CLR属性改变时触发,
2. 使用Binding 关键字来定制,
3. 包含Setter元素,来赋予一个或者多个依赖属性触发器,当Trigger处于active状态或者处于inactive状态时,可以触发一个或者多个TriggerAction.
<3>. Event trigger,
1. 当一个Routed event触发时触发,
2. 可以触发派生自TriggerAction的类,比如BeginStoryboard, SoundPlayerAction.
3. 多用在WPF 动画上
#65 依赖属性继承逻辑树上层元素赋予的值
依赖属性的值可以来自很多不同的数据源,但是一般来说都会从逻辑树上层元素继承值。
这意味着当你在Xaml中高层元素赋予一个依赖属性值,其子元素相同名字的依赖属性会继承其值。
下面是一个在window元素中定义fontstyle而子元素继承到的例子:
< Window x:Class ="WpfApplication1.MainWindow" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:m ="clr-namespace:PersonLib;assembly=PersonLib" Title ="MainWindow" Height ="350" Width ="525" FontStyle ="Italic" > < StackPanel Orientation ="Vertical" > < Button Content ="Run" Height ="23" Width ="75" /> < Button Content ="Skip" Height ="23" Width ="75" /> < StackPanel Orientation ="Horizontal" > < Label Content ="Inside 2nd StackPanel" /> < Label Content ="I do my own FontStyle" FontStyle ="Normal" /> </ StackPanel > </ StackPanel > </ Window >
子元素中的Label会继承window定义的Italic的字体。
#66 依赖属性冒泡寻找其继承值
一个UI元素会向上寻找其需要继承的值,除非寻找到独特定义的属性则会一直向上冒泡寻找到根元素。
下面有个button中寻找fontstyle属性值的例子,穿过了stackpanel和grid一直到window找到其定义值。
< Window x:Class ="WpfApplication1.MainWindow" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:m ="clr-namespace:PersonLib;assembly=PersonLib" Title ="MainWindow" Height ="350" Width ="525" FontStyle ="Italic" > < Grid > < StackPanel Orientation ="Vertical" > < Button Content ="Run" Height ="23" Width ="75" /> < Button Content ="Skip" Height ="23" Width ="75" /> </ StackPanel > </ Grid > </ Window >
#67 UI元素控件的类继承图
#68 WPF UI元素的四个基础类
存在四个基础类,大多数UI元素继承自它们,或者你自己定制一些类的时候也是继承自它们。
1. ContentElement, 2. FrameworkContentElement, 3. UIElement, 4. FrameworkElement.
下一期会有更多关于WPF内置结构的Tips,希望能多多关注~