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

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. 当同时存在多个作用范围的样式时,优先级为:行内样式 > 局部样式 > 全局样式

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

http://www.dtcms.com/a/532267.html

相关文章:

  • 有没有专业做盐的网站手机wap网站程序
  • 【线程同步系列6】一个基于VC封装的多线程类CMyThread(类似QT中的QThread类的run方法)
  • python+vue旅游购票管理系统设计(源码+文档+调试+基础修改+答疑)
  • 宠物管理|宠物店管理|基于SSM+vue的宠物店管理系统(源码+数据库+文档)
  • 站内关键词自然排名优化制作图片的免费软件
  • Cline中模型识别任务与clinerules相关性的实现逻辑
  • Linux 进程面试考点:进程状态、通信方式、信号量等关键问题速记
  • 网站建设有哪些类型西昌网站建设公司
  • 风中有朵雨做的云网站观看美容网站开发
  • Java IO 流详解:字符流(Reader/Writer)与字符编码那些事
  • C++新特性—— 智能指针(shared_ptr/unique_ptr/weak_ptr)
  • OpenCV(十四):绘制直线
  • 支持支付宝登录的网站建设wordpress指定分类文章列表
  • Halcon卡尺 Measure_pos原理与实现(C++ 和Python版本,基于OpenCV)
  • 在线课程网站开发任务书邢台 网站建设
  • 专业做英文网站如何看出一个网站优化的是否好
  • PostgreSQL事务隔离级别详解
  • 从底层逻辑到实战落地:服务端与客户端负载均衡器的深度拆解
  • 笔试强训(十三)
  • 基于罗伊适应模型的产后抑郁家庭护理干预研究综述​
  • Bright Data 抓取浏览器API实战:助力高效完成定向大规模数据稳定采集
  • 合肥市做效果图的网站最适合新人的写作网站
  • 关于做视频网站的一些代码南京网站制作公司怎么样
  • 6分钟制作TikTok游戏领域热门短视频分析AI Agent
  • 自由通讯的魔法:Go从零实现UDP/P2P 聊天工具
  • Cortex-M3-STM32F1 开发:(十二)HAL 库开发 ➤ SysTick 系统滴答定时器
  • go-ethereum core之以太网虚拟机EVM
  • 自己怎么免费做网站网站开发 合同
  • 网站如何做脚注一般使用的分辨率的显示密度是多少dpi )
  • 嵌入式开发中ln命令使用指南