注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

分享,态度 ·~~

—— 十年太长,五年;如果可以回到五年前,你最想对那时候的自己说什么?

 
 
 

日志

 
 

样式的自动使用--设置和获得控件的默认样式  

2009-09-06 23:14:38|  分类: DotNet |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

7.3.3  样式的自动使用--设置和获得控件的默认样式

另外一个属性TargetType则可以用来限制使用该样式的控件种类。通过设置该属性,软件开发人员可以防止该样式在程序中的滥用。该属性的另外一个用处是:当样式声明中设置了该属性以后,XAML就可以在属性的指定中省略属性所在的类型。如果Setter中Property所指定的属性在TargetType所指定的类型中不存在,那么编译器将会报错。同时,如果需要设置样式的控件类型与样式中通过TargetType所指定的类型不一致,那么编译器也会在编译时产生报错信息。TargetType的设定需要使用扩展关键字x:Type来完成。其形式如下:

<Style x:Key="baseStyle" TargetType="{x:Type Control}">
<Setter Property="Control.Background" Value="Red"/>
<Setter Property="Control.BorderBrush" Value="Black"/>
</Style>

在限制了使用类型的情况下,软件开发人员就可以在Setter的Property属性设置中省略对属性所在类型的声明。更改后的样式如下:

<Style x:Key="baseStyle" TargetType="{x:Type Control}">
<Setter Property="Background" Value="Red"/>
<Setter Property="BorderBrush" Value="Black"/>
</Style>

对资源中被设置了关键字的样式的使用需要在程序中显式地声明。因此在数独游戏中,软件开发人员需要对81个按钮控件所使用的样式全部进行一次设定。既然样式是为了减少编码时的重复编码,因此微软也提供了一种方法省略这种冗余。该方法就是在一定范围中设置按钮控件的默认样式。设置默认按钮样式的方法是在通过省略样式索引的情况下指定TargetType完成的,代码如下所示。
<Style TargetType="{x:Type Control}">
<Setter Property="Background" Value="Red"/>
<Setter Property="BorderBrush" Value="Black"/>
</Style>

这样,在包含该样式资源定义的元素的作用范围内,所有Control类以及没有定义默认样式的Control类的派生类将默认使用该样式所描述的外观。或许读者还有疑问:不是说每个在ResourceDictionary中的项目都需要有一个用于访问的索引么,为什么在上面的例子中就没有索引?实际上,上面的例子是有访问索引的,并且该索引是由WPF自动生成的。它的值就是{x:Type Control},即TargetType属性的取值。软件开发人员可以使用如下语句对该样式进行访问。

<Button Style="{StaticResource {x:Type Button}}"…/>
也正是因为默认样式所具有的默认索引是使用该样式的类型,因此对于同一种界面元素,软件开发人员只可以定义一种默认样式。重复定义默认样式会造成ResourceDictionary中各项目中的索引值发生冲突。

从上面的讲解中可以知道每个控件都有默认的样式,该样式的默认索引就是它的TargetType属性的取值。因此后台代码可以通过该索引访问到按钮控件的默认样式,并在得到控件的默认样式后对其进行更改并保存为新的默认样式(在不同的ResourceDictionary中)会更改所有的控件样式使其具有所期望的效果。

获得按钮默认样式的方法有许多种。其中最常见的方法就是通过XamlWriter获得,其代码如下所示。

String templateString = XamlWriter.Save(control.Style);

其中control表示需要获得其模板的控件。读者可能会感到奇怪,为什么要使用XamlWriter的Save函数,它不是"保存"的意思么?从MSDN上查到的关于该函数的描述是:该函数返回一个表示传入参数描述的XAML字符串。

通过使用同样的方法,C#代码也可以获得当前主题下的某个控件的当前样式。同时,后台代码也可以通过资源对样式进行访问,其代码如下所示。

object key = control.GetValue(FrameworkElement.DefaultStyleKeyProperty);
Style style = (Style)Application.Current.FindResource(key);
string styleString = XamlWriter.Save(style);

 

【from 《WPF全视角分析》 http://book.51cto.com/art/200906/127978.htm

  评论这张
 
阅读(483)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017