配色: 字号:
wpf风格
2017-11-23 | 阅:  转:  |  分享 
  
WPF风格WPF中的风格实际上是集中设定元素属性的一种机制,这里的风指是指FrameworkElement和FrameworkContent
Element及派生类所支持的相关属性或附加属性。它可以部分弥补XAML语言不支持循环语句的不足,由于在风格中引入触发器,在XAM
L里可以方便地实事项处理,甚至动画,而不必写任何C#或VB代码。例如,网页或窗口中有很多按镇钮,而希望所有的按钮看起来都一样,这时
最好的解决方案是使用风格。从这个角度来说,WPF的风格和HTML网页中的CSS相似;但是由于WPF支持传递事件。相关属性和触发器,
所以WPF风格的功能更为强大。本章详细讨论WPF中的风格类,并用实例说明在XAML中使用风格类中属性的方法。Style类位于Sys
tem.Windows命名空间中,它定义了7个属性:属性名功能Resource读写SettersSetter和EventSette
r类的集合TriggersTriggerBase的集合TargetType说明风格的施加对象BaseOn说明当前风格所基于的对象I
sSealed只读,其true则不能派生出其它风格Dispatcher读写,说明和风格相关的DispatchObject类Sett
ers它是Style类的重要属性,它的类型时SetterBaseCollection,这个类型是可以放入SetterBase类型的
包容器,所以只要是从SetterBase派生出来的对象都可以放入到SerrerBaseCollection中,实际上SetterB
ase中派生出的两个类是:SetterEventSetterSetterBase类中只定义了一个属性IsSealed和一个方法Ch
eckSealed.Setter类中定义了三个属性:PropertyValueTargetNameXAML中使用Setter的语
法如下:在C#中,就是创建Setter对象:SettermySetter=new
Setter();SettermySetter=newSetter(Control.FontSizeProperty,
24);SettermySetter=newSetter(Control.FontSizeProperty,24,"But
ton");Setter类中的Peroperty一定要是相关属性,在说明该相关属性时还要加上属性所属的类(可以是基类,也可以是具体
的派生类),比如Control就是WPF中的一个基类。xtBlock.Style>>实际上我们很少对某一个控件使风格。使用风格的目的是:当改某个风格时,希望所有使用该风格的控件都会改变它们的表现形式,而不必对每一
个控件逐一修改。要实现这样的功能,我们肯定不能在控件中使用风格;应该把风格作为资源的一部分。我们知道,在WPF中,Framewor
kElemen,FrameWorkContentElement和Application三大类里都含有Resource属性,即在
这三个类及其派生类中,可以使用资源。一旦在资源中定义了风格,就可以在具体的控件中引用相应的风格,从而达到多个控件具有统一风格的视觉
效果。通常我们把风格定义在Application的Resource中,这样整个应用程序都可以共享同一风格。ources>kground"Value="Yellow">tSize"Value="24">y"Value="TimesNewRoman"><
StackPanel>largeText}">StaticResourcelargeText}">由于在WPF控件中存在
继承关系,某此派生类中的属性是从基类中继承过来的,若设置其类的属性,那么这此属性会自动在派生类中起作和。因此可以利用这个特点来灵活
地使用属性。比如,把上面的风格中的Property的值改成Control:Key="largeText">low">etter>an">Text="第一个TEXTBLOCK"Style="{StaticResourcelargeText}">ck>xt}">MyB
utton
largeText风格同时对Btton和TextBlock起了作用,原因是T
extBlock和Button控件都是从Control类派生出来的。使用不同的风格定义两个资源,引用即可。TargetTypeTa
rgetType也是Style为中的一个属性。这个用来说明所定义的风格要施加的对象,使用TargetType属性和HTML或ASP
网页中定义的CSS非常类似。n}">r>erProperty="Control.FontFamily"Value="TimesNewRoman">>XTBLOCK">ck>都没有为元素指定风格,但Button类型却能应
用到资源中定义的风格,都是因为TargetType="{x:TypeButton}"的作用由于使用了TargetType,故可以
省略Setter中Property所指定的类="TimesNewRoman">可以改为:lue="TimesNewRoman">WPF还支持视觉树上风格的覆盖,其原则是控件将采用离其最近的风格。<
Window.Resources>operty="Control.Background"Value="Yellow">erty="Control.FontSize"Value="24">ntrol.FontFamily"Value="TimesNewRoman">leTargetType="{x:TypeTextBlock}">Value="Beige">>
ype="{x:TypeTextBlock}">d">一个TEXTBLOCK">tBlock>我们看到Window中定义的资源被Stackpanle中定义的覆盖
掉了.WPF允许同时用TargetType和x:Key.这样,就可以对同一个目标对象定义多个风格,然后再在控件中用Key来引用即
可。BasedOn我们知道,面向对象编程最大的优势之一就是支持继承和覆盖,本小节将要讨论风格本身的继承和覆盖,这种特性类似C#或C
++的基类和派生类,就是在Style里使用BasedOn属性.ormal">
Setter>tter>normal}">ter>ormal}">ter>tyle>
eOnRedNormal测试"Style="{StaticResourceRedNormal}">
ceBlueSmall}">all"Style="{StaticResourcenormal}">
Bas
eOn语法:BasedOn="{StaticResourcebaseKey}"BaseOn还可以对用TargetType定义的风
格进行扩展和覆盖"Value="Red">Setter>rce{x:TypeControl}}">">。。。TriggersTriggers是St
yle类的另一大重要属性,Triggers是复数的,意思是触发器集合。触发器是在一定条件下发生的某些事。WPF定义了5个触发器类:
DataTriggerMutiDataTriggerTriggerMutiTriggerEventTriggerDataTrigg
er中带有Banding属性,即它支持数据绑定。使用单一条件的触发器语法:使用Setter来
修改风格当相关属性的值发生变化时,我们希望风格就该做出相应反应。这种反应是通过Setter设定控件中其它相关
属性来实现的。注意在使用Trigger时要避免死循环。Property="Control.FontSize"Value="12">y="Control.Foreground"Value="Red">iggerProperty="Control.IsMouseOver"Value="true">ty="Control.FontSize"Value="24">rol.Foreground"Value="Yellow">ers>…n}">Button单一条件触发器使用多个条件的触发器如果要多个条件同是成立才改变控件风格的话,那
么就要用MultiTrigger.ionProperty="xxx"Value="xxx">...ty="xxx"Value="xxx">terProperty=""Value="">...区别于Trigger的
是MutiTrigger中含有Conditions属性,它是Condition的集合,用来定义多个触发的条件。ggers>ty="IsMouseOver"Value="True">sChecked"Value="True">etterProperty="FontSize"Value="48">Style.Triggers>CHBX1
CHBX2
使用数据触发器(DataTrigger)和前面的Trigger和Muti
Trigger非常类似,但是DataTrigger多了一个Binding属性:dingElementName=xxx,Path=相关属性}"Value="相关属性值">leTargetType="Button">indingElementName=cbx,Path=IsChecked}"Value="True">operty="FontSize"Value="24">nd"Value="Red">e>CHBX1CHBX2ox>风格中的资源风格作为一种资源,可以很方便地嵌入到Application,W
indow,Page以及各种控件中,同时风格本身也是资源的容器,Style类本身含有Resource属性,可以在其中放入资源。tyle.Resources>嵌入资源>="0.5,1"StartPoint="0.5,0">tStop>IsSealedC#中,当不希望其它程序员从某个类派生出子类时,在该类前加上关键字sealedpublicsealedclassmyClass{}在Style中IsSealed属性表示该风格不能再改变,这是一个只读属性。把风格定义在单独文件中定义在xxx文件中…引入xxx文件在FrameworkContentElement中使用风格风格不仅要吧使用在UI元素上,还可以用在文档上。下一个文档复习WPF的属性系统时间过得太久,很多WPF属性的知识已经模糊。。。
献花(0)
+1
(本文系luan_it首藏)