WPF学习(5) – 样式、模板、皮肤、主题

简介:

1. 样式

1.1 样式的基本使用

样式类似于html中的样式,用来提取出来共用的一些外观属性,一般其它地方共享。style是一组Setter的集合。

一个简单的例子:

复制代码
<StackPanel Orientation="Horizontal" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<StackPanel.Resources>
<Style x:Key="buttonStyle">
    <Setter Property="Button.FontSize" Value="22"/>
    <Setter Property="TextBox.Background" Value="Black"/>
    <Setter Property="Button.Background" Value="Purple"/>
    <Setter Property="TextBox.Foreground" Value="White"/>
    <Setter Property="Button.Height" Value="50"/>
</Style>

</StackPanel.Resources>
    <Button Style="{StaticResource buttonStyle}">1</Button>
    <Button Style="{StaticResource buttonStyle}">2</Button>
    <Button Style="{StaticResource buttonStyle}">3</Button>
    <TextBox Style="{StaticResource buttonStyle}"></TextBox>
</StackPanel>
复制代码

 

使用样式的特点:

* 当Style被应用到一个没有默写属性的元素上的时候,它只会对存在的属性进行设置,不存在的则会被忽略。

* Sytle还有一个不确定性,比如上面定义的TextBox.Background为Black不起作用,应该是被下面的Button.Background覆盖了。这些产生的原因还不确定,为了避免这种情况,建议为不同的类型创建不同的Style

* 限制Style的使用范围。可以设置TargetType属性来限制Style只能应用于特定的控件。

* 隐式Style,也叫类型化样式, 就是没有指定key的Style, 那么该Style会被默认的应用到所有的目标类型元素。类型化样式的有效范围是由Style资源的位置决定的。

 

1.2 触发器

三种类型的触发器:

  • 属性触发器, 当依赖属性的值改变时调用
  • 数据触发器,当普通.net属性值改变时调用
  • 事件触发器,当路由事件被触发时调用

 

我们可以使用属性触发器和数据触发器来设置不同的Style。

 

一个属性触发器的例子:

复制代码
<StackPanel Orientation="Horizontal" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200">
<StackPanel.Resources>

          <Style TargetType="{x:Type TextBox}">

               <Style.Triggers>

                     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Value="disabled">

                            <Setter Property="IsEnabled" Value="False"/>

                     </DataTrigger>

               </Style.Triggers> 

               <Setter Property="Background" Value="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>      
               <Setter Property="Width" Value="200"/>      
          </Style>

</StackPanel.Resources>

<TextBox Margin="3"/>

</StackPanel>
复制代码

 

2. 模板

目前来看,你只能通过修改控件的属性来修改外观,但是实际上可以使用控件模板来随意的改造控件。

它的原理是模板允许你用空想出来的任何东西完全替换一个元素的可视树,但其它的功能不会受到影响。

 

一个使用控件模板的例子,一个漂亮的圆形Button

复制代码
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid.Resources>
    <ControlTemplate x:Key="buttonTemplate">
      <Grid>
        <Ellipse Width="100" Height="100">
          <Ellipse.Fill>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
              <GradientStop Offset="0" Color="Blue"/>
              <GradientStop Offset="1" Color="Red"/>
            </LinearGradientBrush>
          </Ellipse.Fill>
        </Ellipse>
        <Ellipse Width="80" Height="80">
          <Ellipse.Fill>
            <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
              <GradientStop Offset="0" Color="White"/>
              <GradientStop Offset="1" Color="Transparent"/>
            </LinearGradientBrush>
          </Ellipse.Fill>
        </Ellipse>
      </Grid>
    </ControlTemplate>
  </Grid.Resources>
  <Button Template="{StaticResource buttonTemplate}">OK</Button>
</Grid>
复制代码

 

在控件模板中,也可以使用Trigger和限制目标类型。

3. 皮肤

WPF并没有独特的叫做皮肤的概念,也没有一个正式的换肤概念,那是因为WPF不需要这种东西。

可以用WPF写一个动态换肤的应用程序或组件,这可以通过WPF的动态资源机制加上Style和模板来实现。

4. 主题

皮肤是跟着应用程序走的,但主题通常涉及操作系统的视觉特性,它会反映在所有程序的用户界面的元素上。

对于默认的控件模板而言,于操作系统的主题保持一致很重要。

4.1 使用系统颜色、字体和参数

当Windows主题改变时,由SystemColors, SystemFonts和SystemParameters类提供的成员会自动更新。我们可以使用它们,放到我们的样式和模板中,这是让它们融入到用户主题的一个简单方式。

4.2 创建自己的主题样式和模板

第一步把指定的资源放入不同的资源字典的XAML文件中(一个主题一个文件), 然后经编译放入程序集中。 你可以把资源字典放入主题目录(必须在项目的根目录),从而把每个资源字典指派为一个主题字典,并把它们命名为ThemeName.ThemeColor.xaml。当你的应用程序启动或者主题改变时,WPF会自动加载和应用主题字典。



本文转自JustRun博客园博客,原文链接:http://www.cnblogs.com/JustRun1983/archive/2012/08/29/2662456.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
XML 开发框架 前端开发
WPF学习之基础知识篇
WPF(Windows Presentation Foundation)具有一个复杂且强大的架构,旨在提供丰富的用户界面、图形、动画和多媒体功能。
73 9
|
7月前
|
前端开发 C#
WPF学习小记
WPF学习小记
WPF疑难问题之Treeview中HierarchicalDataTemplate多级样式
WPF疑难问题之Treeview中HierarchicalDataTemplate多级样式
359 0
|
4月前
|
开发者 C# 存储
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
95 0
|
4月前
|
开发者 C# 存储
WPF开发者必读:样式与模板的艺术,轻松定制UI外观,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,样式与模板是实现美观界面与一致性的关键工具。样式定义了控件如字体、颜色等属性,而模板则允许自定义控件布局与子控件,两者均可存储于`.xaml`文件中。本文介绍了样式与模板的基础知识,通过示例展示了如何创建并应用它们来改变按钮的外观,从而提升用户体验。
91 0
|
4月前
|
存储 前端开发 C#
WPF/C#:更改界面的样式
WPF/C#:更改界面的样式
44 0
|
5月前
|
C# 开发者 Windows
WPF在.NET9中的重大更新:Windows 11 主题
这也是一个很好的学习WPF的项目,可以通过看源代码提升自己的WPF水平。 WPF Gallery演示如何在标记中指定 XAML 控件,因为每个控件页都显示用于创建每个示例的标记。它还将显示您的应用程序的所有可能的布局选项。 WPF Gallery应用还包含有关使用颜色、排版和图标开发特殊应用程序的设计指南。它还包括一个示例页,用于演示如何使用不同的控件在 WPF 应用程序中创建用户界面。 WPF在.NET 9中可以使用Win11主题的控件了,有助于WPF开发者们开发出更符合现在设计风格、更美观的界面。 希望WPF越来越好。
65 0
|
7月前
|
C#
浅谈WPF之样式与资源
WPF通过样式,不仅可以方便的设置控件元素的展示方式,给用户呈现多样化的体验,还简化配置,避免重复设置元素的属性,以达到节约成本,提高工作效率的目的,样式也是资源的一种表现形式。本文以一个简单的小例子,简述如何设置WPF的样式以及资源的应用,仅供学习分享使用,如有不足之处,还请指正。
125 0
|
算法 C# UED
浅谈WPF之控件模板和数据模板
WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计,同时还推出了以模板为核心的新一代设计理念。在WPF中,通过引入模板,将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类:数据模板【Data Template】和控件模板【Control Template】。
211 8
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
WPF-Binding问题-模板样式使用Binding TemplatedParent与TemplateBinding区别
234 0