WPF教程(八)样式入门一

本文深入探讨WPF样式的基础使用及高级特性,包括事件关联、多层继承和隐藏键值的应用等,并介绍了如何通过样式实现控件外观的统一管理和变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

样式是我认为WPF中一块极为重要的知识,也体现该种框架比较厉害之处:(1)UI设计与动画方面的炫丽;(2)XMAL代码的引入使得代码的编写能够前后端分离,这种都是传统界面框架都不能比拟的,比如Winform、C++的MFC。我认为这是微软向当前We前端开发模式的学习,WPF是过渡的框架。当然,这些都是题外话。

WPF的样式是非常强大的,除了与HTML标记中的CSS类似,它还能够支持触发器(Trigger),比如当元素属性发生变化时,可通过触发器改变控件样式,但本文中暂不涉及触发器(下一篇博客里写)。特基础的不讲了,先看下事件关联例子。

<Window x:Class="Style.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="textblockstyle" TargetType="TextBlock">
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="TextAlignment" Value="Center"/>
            <Setter Property="Padding" Value="5"/>
            <EventSetter Event="TextBlock.MouseEnter" Handler="element_mouseEnter"/>
            <EventSetter Event="TextBlock.MouseLeave" Handler="element_mouseLeave"/>
        </Style>
    </Window.Resources>
    <Grid>
        <WrapPanel>
            <TextBlock Style="{StaticResource textblockstyle}" Text="helloworld"/>
        </WrapPanel>
    </Grid>
</Window>
  public partial class MainWindow : Window
  {
      public MainWindow()
      {
          InitializeComponent();
      }
      private void element_mouseEnter(object sender, MouseEventArgs e)
      {
          ((TextBlock)sender).Background = new SolidColorBrush(Colors.Aqua);
      }
      private void element_mouseLeave(object sender, MouseEventArgs e)
      {
          ((TextBlock)sender).Background = null;
      }
   }

这种事件关联仍是没有实现软件的低耦合性,没发挥出WPF高端之处。当然,在后续触发器(Trigger)介绍,就可以打破这种尴尬的境况,下面介绍样式的多层继承。

<Window x:Class="Style.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="textblockstyle" TargetType="TextBlock">
            <Setter Property="HorizontalAlignment" Value="Center"/>
            <Setter Property="TextAlignment" Value="Center"/>
            <Setter Property="Padding" Value="5"/>
            <EventSetter Event="TextBlock.MouseEnter" Handler="element_mouseEnter"/>
            <EventSetter Event="TextBlock.MouseLeave" Handler="element_mouseLeave"/>
        </Style>
        <Style x:Key="BaseOnStyle" 
        TargetType="TextBlock" 
        BasedOn="{StaticResource textblockstyle}">
            <Setter Property="Control.Foreground" Value="Red"/>
        </Style>
    </Window.Resources>
    <Grid>
        <WrapPanel>
            <TextBlock Style="{StaticResource textblockstyle}" Text="helloworld"/>
            <TextBlock Text="Inherited Style TextBlock" Style="{StaticResource BaseOnStyle}"/>
        </WrapPanel>
    </Grid>
</Window>
//注释:后台代码不变

这里提个小技巧,隐藏键值可以自动将样式用到元素树上所有该类控件上,注意下面程序如何隐藏键值,大有玄机,里面涉及到一些知识点。

<Window x:Class="Style.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <Style x:Key="{x:Type TextBlock}">
        <!--隐式设置为 {x:Type TextBlock}-->
        <!--<Style TargetType="TextBlock">-->
            <Setter Property="Control.Foreground" Value="Pink"/>
            <Setter Property="TextBlock.FontSize" Value="18"/>
        </Style>
  </Window.Resources>
    <Grid>
        <WrapPanel>
            <TextBlock Text="hello"/>
            <TextBlock Text="hi"/>
            <TextBlock Style="{x:Null}" Text="good"/>
        </WrapPanel>
    </Grid>
</Window>

仔细分析,总结出5个知识点:

1. 显示设置隐藏键值,后面TargetType可以写,也可以不写。上段程序显然没写出来,这涉及到知识点3,先注意写法。

2. 隐式设置隐藏键值,请看注释掉的部分,TargetType必须写明,这样相当于隐藏了{x:Type TextBlock},效果是跟第一点显示设置一样的,都可以用到元素树中此类控件,先注意写法,也涉及知识点3。

3. 如果是没有写出TargeType样式类型,必须用类名来限制Setter对象的Property属性值,否则报错。上面程序,显然加TextBlock和Control类名,如果指明了,可写可不写类名。

4. 如果某一此类控件不想用指定样式,可以将Style置Null重新写此属性或直接重新写此属性,都可覆盖原资源里的设置。

5. 同一范围不能重复定义相同key样式,包括相同(显式/隐式)隐藏键值。

如果希望在多个样式中(或在同一样式的多个设置器中)重用相同的属性值,可以将其定义为资源,然后再在样式中使用资源:

  <Window.Resources>
        <Brush x:Key="brush" >Black</Brush>
        <Style x:Key="{x:Type TextBlock}">
            <Setter Property="Control.Foreground" Value="{StaticResource brush}"/>
            <Setter Property="TextBlock.FontSize" Value="18"/>
        </Style>
  </Window.Resources>

在WPF中还存在这样一些情况,在元素框架层次中(不管是否有TargetType属性)的多个位置定义了同一个属性。例如,在Control类和TextBlock类,中都定义了全部的字体颜色属性。

<Window.Resources>
<Style x:Key="foreground">
    <Setter Property="TextBlock.Foreground" Value="Yellow"/>
    <Setter Property="Button.Foreground" Value="Yellow"/>     
</Style>
</Window.Resources>

不管是哪个控件,只要支持这个属性,都可以引用这个字色样式,那会使用哪个色体呢?尽管TextBlock.FontFamily属性和Button.FontFamily属性是在他们各自的基类中分别声明,但它们都引用同一个依赖项属性。所以,当使用这个样式时,WPF设置Foreground属性两次,最后应用的设置具有优先权。

总结

Style样式如果不加TargetType,其它控件都可以使用该样式。如果加了目标类型,其它控件引用直接回报错。如果显示设置隐藏键值,只是不会作用于其它控件,两者还是有区分的

样式的基本使用知识点大致就上面几点,深层去剖析,涉及到依赖属性这个难点,我也有详细介绍过这块知识,有兴趣的朋友可以去看看,下面介绍样式的第二个重点Trigger。

 

目录 WPF体系结构 .......................................................................................................................................................... 3 WPF应用程序管理 .................................................................................................................................................. 5 WPF应用程序由System.Windows.Application 类进行管理 ................................................................. 5 二、创建WPF应用程序 ................................................................................................................................. 5 三、应用程序关闭 ........................................................................................................................................... 6 四、Application 对象的事件 ........................................................................................................................... 7 五、WPF应用程序生存周期 .......................................................................................................................... 9 WPF窗体 ................................................................................................................................................................ 10 、窗体类 ..................................................................................................................................................... 10 1、XAML文件....................................................................................................................................... 10 2、后台代码文件 ................................................................................................................................... 10 二、窗体的生存周期 ......................................................................................................................................11 1、显示窗体 ............................................................................................................................................11 2、关闭窗体 ........................................................................................................................................... 12 3、窗体的激活 ....................................................................................................................................... 12 4、窗体的生存周期 ............................................................................................................................... 12 三、其他窗体相关的属性、方法、事件 ..................................................................................................... 15 四、定义异形窗体 ......................................................................................................................................... 16 StackPanel、WrapPanel、DockPanel 容器 .......................................................................................................... 19 、StackPanel ............................................................................................................................................... 19 1、可以使用Orientation 属性更改堆叠的顺序 ................................................................................... 19 2、设置控件的属性,调整控件的显示................................................................................................ 20 二、WrapPanel ................................................................................................................................................ 20 三、DockPanel ................................................................................................................................................ 21 Grid UniformGrid 容器 ........................................................................................................................................ 22 、Grid .......................................................................................................................................................... 22 二、使用GridSplit分割 ................................................................................................................................ 23 三、UniformGrid ............................................................................................................................................ 25 Canvas、InkCanvas布局 ....................................................................................................................................... 27 、Canvas ..................................................................................................................................................... 27 二、InkCanvas ................................................................................................................................................ 27 WPF对控件其类型的继承方式如下 .................................................................................................................... 29 WPF控件内容模型 ................................................................................................................................................ 32 、ContentControl模型 ............................................................................................................................... 35 二、HeaderedContentControl模型 ................................................................................................................ 36 三、ItemsControl模型 ................................................................................................................................... 38 1、使用ItemSource 属性 ....................................................................................................................... 38 2、使用Items属性 ................................................................................................................................ 40 四、HeaderedItemsControl模型 .................................................................................................................... 42 Panel Decorator TextBlock 内容模型 .................................................................................................................. 44 、Panel内容模型 ....................................................................................................................................... 44 本文来自网络,由大胡子制作.版权归原作者所有.如果你有 wpf 的好资料可以联系我 QQ:249872349,Email:BigBeard@126.com 二、Decorator内容模型 ................................................................................................................................ 45 三、TextBlock 模型 ........................................................................................................................................ 46 四、TextBox 模型 ........................................................................................................................................... 49 依赖项属性和路由事件 ......................................................................................................................................... 50 、依赖项属性(Dependency Property ....................................................................................................... 50 1、依赖项属性与CLR 包装属性 ......................................................................................................... 50 2、使用由依赖项属性提供的属性功能................................................................................................ 51 3、自定义依赖项属性及重写依赖项属性 ............................................................................................ 52 二、路由事件(RoutedEvent)..................................................................................................................... 53 键盘输入、鼠标输入、焦点处理 ......................................................................................................................... 56 、键盘类和键盘事件 ................................................................................................................................. 56 二、鼠标类和鼠标事件 ................................................................................................................................. 57 三、焦点处理 ................................................................................................................................................. 60 1、键盘焦点: ....................................................................................................................................... 60 2、逻辑焦点 ........................................................................................................................................... 61 3、键盘导航 ........................................................................................................................................... 61 4、焦点事件 ........................................................................................................................................... 61 WPF命令 ................................................................................................................................................................ 63 、命令: ..................................................................................................................................................... 64 二、命令源 ..................................................................................................................................................... 65 三、命令目标 ................................................................................................................................................. 66 四、命令绑定 ................................................................................................................................................. 67 WPF资源 ................................................................................................................................................................ 70 、什么是资源 ............................................................................................................................................. 70 二、资源的定义及XAML中引用 ................................................................................................................ 70 三、XAML解析资源的顺序 ......................................................................................................................... 74 四、静态资源(StaticResource)和动态资源(DynamicResource) ........................................................ 77 五、不同类型的资源 ..................................................................................................................................... 81 1、程序集资源。 ................................................................................................................................... 81 2、对象资源 ........................................................................................................................................... 82
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值