当前位置: 首页 > article >正文

WPF 样式

WPF 有自己的样式设置系统,也自带类似 Winform 的默认样式。默认样式比较一般,我们可以使用下面几种方式自定义好看的 wpf 样式。

1. 本地直接设置

比如更改按钮的背景色和字体颜色,

<Grid>
    <StackPanel Orientation="Horizontal">
        <Button Margin="4" Content="Test" Width="100" Height="40" />
        <Button Margin="4" Content="Test" Width="100" Height="40" Background="DeepPink" Foreground="White" />
    </StackPanel>
</Grid>

在这里插入图片描述

2. 在资源中设置

如下面的样式资源,

<Style x:Key="Base.Style" TargetType="{x:Type Button}">
    <Setter Property="Width" Value="100" />
    <Setter Property="Height" Value="40" />
</Style>

<Style x:Key="Pink.Style" TargetType="{x:Type Button}" 
       BasedOn="{StaticResource Base.Style}">
    <Setter Property="Background" Value="DeepPink" />
    <Setter Property="Foreground" Value="White" />
</Style>

可以将它们放在控件的 Resource 属性下,也可以放到资源字典中。

放在控件 Resource 下,

<UserControl x:Class="WpfApp1.Views.StyleView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <Style x:Key="Base.Style" TargetType="{x:Type Button}">
            <Setter Property="Width" Value="100" />
            <Setter Property="Height" Value="40" />
        </Style>

        <Style x:Key="Pink.Style" TargetType="{x:Type Button}" 
               BasedOn="{StaticResource Base.Style}">
            <Setter Property="Background" Value="DeepPink" />
            <Setter Property="Foreground" Value="White" />
        </Style>
    </UserControl.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal">
            <Button Margin="4" Content="Test" Style="{StaticResource Base.Style}" />
            <Button Margin="4" Content="Test" Style="{StaticResource Pink.Style}" />
        </StackPanel>
    </Grid>
</UserControl>

放在资源字典,就需要手动引用资源字典(和直接放在控件 Resources 下一样),

<UserControl x:Class="WpfApp1.Views.StyleView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <UserControl.Resources>
        <ResourceDictionary Source="pack://application:,,,/WpfApp1;Component/MyDictionary.xaml" />

    </UserControl.Resources>
    <Grid>
        <StackPanel Orientation="Horizontal">
            <Button Margin="4" Content="Test" Style="{StaticResource Base.Style}" />
            <Button Margin="4" Content="Test" Style="{StaticResource Pink.Style}" />
        </StackPanel>
    </Grid>
</UserControl>

如果引用全局的资源字典,一般都是放到 App.xaml 中,

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary Source="pack://application:,,,/WpfApp1;Component/MyDictionary.xaml" />

    </Application.Resources>
</Application>

3. 样式优先级

一般样式设置都是有优先级的,比如我在样式资源和本地都设置了按钮背景色,

<Grid>
    <StackPanel Orientation="Horizontal">
        <Button Margin="4" Content="Test" Style="{StaticResource Base.Style}" />
        <Button Margin="4" Content="Test" Style="{StaticResource Pink.Style}" Background="DarkGreen" />
    </StackPanel>
</Grid>

将以本地设置为优先,
在这里插入图片描述
参考:
Dependency property value Precedence

优先级总结(从高到低):

  1. ControlTemplate trigger

  2. locally

  3. 本地 Style trigger

  4. 本地Style

  5. ControlTemplate

注,如果定义了无 key 的按默认样式,如:

<Style TargetType="Button">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Border x:Name="border">
                    <ContentPresenter x:Name="contentPresenter" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="border" Property="Background" Value="Red" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

同时又指定了本地样式:

<Button>
    <Button.Style>
        <Style TargetType="Button">
            <Setter Property="Background" Value="Yellow" />
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="true">
                    <Setter Property="Background" Value="Green" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

那么鼠标放上去不会显示红色,而是显示系统自带的 #FFBEE6FD
在这里插入图片描述
如果把本地 Style 删除,鼠标放上去,就会显示红色。

我的理解是:既然使用了本地 Style, 那么自定义的 Button 样式就不会被应用到这个按钮上,所以只会跟系统自带的 Button 样式作优先级对比。删除本地 Style 则恢复到:自定义样式 和 系统自带的 Button 样式作优先级对比的情况。


http://www.kler.cn/a/466018.html

相关文章:

  • NRF24L01模块STM32通信-通信初始化
  • v-model与 mvvm 回顾
  • SpringBoot中实现拦截器和过滤器
  • 联邦学习中LLM分割的主流方法
  • ELK 使用教程采集系统日志 Elasticsearch、Logstash、Kibana
  • 2024年1月4日蜻蜓hr人才招聘系统v1.1.7更新-正式版发布-客户端源代码开源发布供学习-本产品完成上线正式版-修复多个bug-优雅草果果|小无
  • 转换embl为fa脚本embl2fa.py-脚本08
  • 智能手机租赁系统全新模式改变消费习惯与商家盈利路径
  • 社区信息化管理系统(源码+文档+部署+讲解)
  • 数据结构--顺序表(详解)
  • windows文件名的最大长度
  • 批量上传文件
  • 微服务实战——购物车模块实战
  • 机场安全项目|基于改进 YOLOv8 的机场飞鸟实时目标检测方法
  • 使用java语言,自定义redistemplate
  • day26-lvm逻辑卷管理
  • 微机——绪论
  • 亚信安全2025年第1期《勒索家族和勒索事件监控报告》
  • 使用MPTCP+BBR进行数据传输,让网络又快又稳
  • Win32汇编学习笔记03.RadAsm和补丁
  • PTA数据结构作业一
  • AI新闻自动化:使用Tavily Search API构建AI新闻总结助手
  • 大循环引起CPU负载过高
  • MySQL 06 章——多表查询
  • 解决ssh和git秘钥认证失败问题
  • 管理者管理上班摸鱼