WPF 静态样式与动态样式的定义及使用详解

一、静态样式的定义方式

静态样式是在 XAML 中直接定义的样式资源,加载时一次性解析,运行时修改不会影响界面显示。

  1. 全局静态样式(App.xaml 中定义)

    作用范围:整个应用程序所有窗口和控件

    复制代码
    <!-- 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"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
            <!-- 全局按钮样式(带Key,需显式引用) -->
            <Style x:Key="GlobalButtonStyle" TargetType="Button">
                <Setter Property="Background" Value="#2c3e50"/>
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="Padding" Value="10,5"/>
            </Style>
            
            <!-- 全局文本框样式(无Key,自动应用于所有TextBox) -->
            <Style TargetType="TextBox">
                <Setter Property="BorderBrush" Value="#bdc3c7"/>
                <Setter Property="Margin" Value="5"/>
                <Setter Property="Padding" Value="5"/>
            </Style>
        </Application.Resources>
    </Application>
  2. 局部静态样式(在容器中定义)

    作用范围:仅当前容器及其子元素

    复制代码
    <!-- MainWindow.xaml -->
    <Window x:Class="WpfApp1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="静态样式示例" Height="300" Width="400">
        
        <!-- 窗口级局部样式 -->
        <Window.Resources>
            <Style x:Key="WindowLevelLabelStyle" TargetType="Label">
                <Setter Property="FontSize" Value="14"/>
                <Setter Property="Foreground" Value="#34495e"/>
            </Style>
        </Window.Resources>
        
        <StackPanel Margin="10">
            <!-- 面板级局部样式 -->
            <StackPanel.Resources>
                <Style x:Key="PanelLevelButtonStyle" TargetType="Button">
                    <Setter Property="Background" Value="#e74c3c"/>
                    <Setter Property="Foreground" Value="White"/>
                </Style>
            </StackPanel.Resources>
            
            <!-- 控件级局部样式(在具体控件内部定义) -->
            <TextBlock>
                <TextBlock.Resources>
                    <Style TargetType="TextBlock">
                        <Setter Property="TextDecorations" Value="Underline"/>
                    </Style>
                </TextBlock.Resources>
            </TextBlock>
        </StackPanel>
    </Window>
二、静态样式的使用方法

静态样式通过{StaticResource 资源Key}语法引用:

复制代码
<!-- 使用全局样式 -->
<Button Style="{StaticResource GlobalButtonStyle}" Content="使用全局样式"/>
​
<!-- 使用窗口级局部样式 -->
<Label Style="{StaticResource WindowLevelLabelStyle}" Content="使用窗口样式"/>
​
<!-- 使用面板级局部样式 -->
<Button Style="{StaticResource PanelLevelButtonStyle}" Content="使用面板样式"/>
​
<!-- 无Key的样式会自动应用于所有同类型控件 -->
<TextBox Text="自动应用全局文本框样式"/>
三、动态样式的定义与使用

动态样式与静态样式定义方式相同,但引用方式不同,且支持运行时更新:

  1. 动态样式的定义(与静态样式相同)

    复制代码
    <Window.Resources>
        <SolidColorBrush x:Key="DynamicBrush" Color="Green"/>
        
        <Style x:Key="DynamicTextStyle" TargetType="TextBlock">
            <Setter Property="Foreground" Value="{DynamicResource DynamicBrush}"/>
            <Setter Property="FontSize" Value="16"/>
        </Style>
    </Window.Resources>
  2. 动态样式的使用(使用 DynamicResource)

    复制代码
    <TextBlock Style="{DynamicResource DynamicTextStyle}" Text="动态样式文本"/>
    <Button Click="ChangeDynamicStyle">更改动态样式</Button>
  3. 运行时修改动态样式(C# 后台代码)

    复制代码
    private void ChangeDynamicStyle(object sender, RoutedEventArgs e)
    {
        // 修改动态资源,界面会实时更新
        this.Resources["DynamicBrush"] = new SolidColorBrush(Colors.Blue);
        
        // 也可以直接修改样式
        var newStyle = new Style(typeof(TextBlock));
        newStyle.Setters.Add(new Setter(TextBlock.ForegroundProperty, Brushes.Red));
        newStyle.Setters.Add(new Setter(TextBlock.FontSizeProperty, 20.0));
        this.Resources["DynamicTextStyle"] = newStyle;
    }
四、静态样式与动态样式的核心区别
特性 静态样式(StaticResource) 动态样式(DynamicResource)
解析时机 加载时一次性解析 首次使用时解析,之后动态监听
性能 较好(无需持续监听) 略低(需要维护监听机制)
运行时修改 不支持(修改后界面无变化) 支持(修改后界面实时更新)
适用场景 样式固定不变的场景 需要动态切换主题、样式的场景
五、使用注意事项
  1. 静态样式引用的资源必须在 XAML 中定义在引用位置之前

  2. 动态样式可以引用在定义位置之后的资源

  3. 无 Key 的样式(仅指定 TargetType)会自动应用于该类型的所有控件,称为 "隐式样式"

  4. 当同时存在多个作用范围的样式时,优先级为:行内样式 > 局部样式 > 全局样式

通过合理选择静态或动态样式,可以在性能和灵活性之间取得平衡,满足不同场景的需求。

相关推荐
我不是程序猿儿13 小时前
【C#】ScottPlot的Refresh()
开发语言·c#
工程师00714 小时前
C# 基于 HSL 与基恩士 PLC 通信
c#·mc协议·基恩士plc
张人玉17 小时前
c# DataSet 类
数据库·c#·dataset
秦苒&17 小时前
【C语言】详解数据类型和变量(一):数据类型介绍、 signed和unsigned、数据类型的取值范围、变量、强制类型转换
c语言·开发语言·c++·c#
Emma_Maria17 小时前
关于vant-ui-vue 的datepicker 时间选择错乱问题的处理
前端·vue.js·ui
c#上位机17 小时前
C#异步编程之async、await
开发语言·c#
BW.SU18 小时前
RUI Builder-图形化UI设计-工程范例
stm32·单片机·嵌入式硬件·ui·界面设计·单片机驱动彩屏·ra8889
郑州光合科技余经理18 小时前
实战分享:如何构建东南亚高并发跑腿配送系统
java·开发语言·javascript·spring cloud·uni-app·c#·php
用户2986985301418 小时前
如何在 C# .NET 中将 Markdown 转换为 PDF 和 Excel:完整指南
后端·c#·markdown
天天进步201519 小时前
工厂模式的应用:数据读取与算法创建的解耦—— QuantConnect/Lean 源码分析系列二
c#