WPF--样式设置
Posted X·3
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF--样式设置相关的知识,希望对你有一定的参考价值。
WPF--样式设置
Windows Presentation Foundation(WPF)样式设置和模板化是指一套功能(样式、模板、触发器和演示图板),应用程序、文档或用户界面(UI)的设计人员使用这些功能可以创建更好的视觉效果,也可以对其产品的统一外观进行标准化。尽管作者或设计人员可以对应用程序的外观逐个进行大量自定义操作,他们还是需要一个功能强大的样式设置和模板化模型,以便在应用程序内部和应用程序之间维护和共享外观。Windows Presentation Foundation(WPF)就提供了这样的模型。
WPF样式设置模型的另一个功能是实现表示形式与逻辑的分离。这意味着,在开发人员使用C#或Visual Basic进行逻辑编程时,设计人员只需使用XAML即可设计程序的外观。
本篇将讨论样式设置和模板化示例简介应用程序,该应用程序具有两个 TextBlock 元素,以及一个绑定到图像列表的 ListBox 控件:
本篇主要讨论该应用程序的样式设置和模板化方面,而不讨论任何数据绑定概念。另外,了解资源也很重要,正是资源使得样式和模板得以重用。
样式基础知识
您可以将 Style 看作是将一组属性值应用到多个元素的捷径。例如,考虑下面的TextBlock元素及其默认外观:
通过直接对每个TextBlock元素设置FontSize和FontFamily等属性可以更改默认外观。但是,如果希望TextBlock元素可以共享某些属性,则可以在XAML文件的Resources节中创建一个Style,如下所示:
将样式的TargetType设置为TextBlock类型时,该样式会应用于窗口中的所有TextBlock元素。
现在,TextBlock元素的外观如下:
扩展样式
您可能希望两个TextBlock元素共享某些属性值(如FontFamily和居中的 HorizontalAlignment),同时还希望文本“我的图片”具有某些其他属性。在第一个样式的基础上创建一个新样式可以达到这一目的,如下所示:
请注意,已为上面的样式提供了x:Key。若要应用该样式,请将TextBlock的Style属性设置为x:Key值,如下所示:
现在,此TextBlock样式的HorizontalAlignment值为Center,FontFamily 值为Comic Sans MS,FontSize值为26,Foreground值设置为示例所示的 LinearGradientBrush。请注意,我们已重写了基础样式的FontSize值。如果有多个Setter对Style的同一属性进行设置,则最后声明的Setter优先。
下面演示 TextBlock 元素现在的外观:
此TitleText样式扩展了为TextBlock类型创建的样式。此外,使用x:Key值也可以扩展具有x:Key的样式。
TargetType属性(Property)和x:Key属性(Attribute)的关系
如第一个示例所示,如果将TargetType属性设置为TextBlock而不为样式分配x:Key,样式就会应用于所有TextBlock元素。这种情况下,x:Key隐式设置为x:Type TextBlock。这意味着,如果将x:Key值显式设置为x:Type TextBlock之外的任何值,Style就不会自动应用于所有TextBlock元素。此时,必须通过使用x:Key值,将样式显式应用于TextBlock元素。如果样式位于资源部分,并且未设置样式的TargetType属性,则必须提供x:Key。
除了提供x:Key的默认值之外,TargetType属性还指定要应用setter属性的类型。如果未指定TargetType,则必须通过语法Property="ClassName.Property",用类名限定Setter对象的属性。例如,必须将Property设置为"TextBlock.FontSize"或"Control.FontSize",而不要设置Property="FontSize"。
此外,还应注意,很多WPF控件都是由其他 WPF控件组合而成的。如果创建要应用于某个类型的所有控件的样式,可能会得到意想不到的结果。例如,如果针对Window中的TextBlock类型创建一个样式,则该样式会应用于窗口中的所有TextBlock控件,即使TextBlock是另一个控件(如ListBox)的组成部分也不例外。
样式和资源
任何派生自FrameworkElement或FrameworkContentElement的元素都可以使用样式。声明样式的最常见方式是将样式作为XAML文件的Resources节中的资源,如前面的示例所示。由于样式是资源,因此同样遵循所有资源都适用的范围规则:样式的声明位置决定样式的应用范围。例如,如果在应用程序定义 XAML 文件的根元素中声明样式,则样式可在应用程序范围内使用。如果创建的是导航应用程序,并在该应用程序的某个XAML文件中声明样式,则该样式只能在该XAML文件中使用。
以编程方式设置样式
若要以编程方式向元素分配命名样式,请从资源集合中获取该样式,然后将其分配给元素的Style属性。请注意,资源集合中的项是Object类型,因此,将检索到的样式分配给Style属性之前,必须将该样式强制转换为Style。例如,若要对名为textblock1的TextBlock设置定义的TitleText样式,请执行以下操作:
请注意,样式一旦应用,便会密封并且无法更改。如果要动态更改已应用的样式,必须创建一个新样式来替换现有样式。
您可以创建一个根据自定义逻辑选择要应用的样式的对象。
绑定、动态资源和事件处理程序
请注意,使用Setter.Value属性可以指定绑定标记扩展或DynamicResource标记扩展。
到目前为止,我们只讨论了如何使用setter设置属性值。在样式中也可以指定事件处理程序。
以上是关于WPF--样式设置的主要内容,如果未能解决你的问题,请参考以下文章