WPF中样式

news2024/11/23 9:50:32

WPF中样式:类似于winform中控件的属性

<Grid>
        <!-- Button属性 字体大小 字体颜色 内容 控件宽 高 -->
        <Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/>
    </Grid>

 效果如下: 

 如果要创建多个相似效果的按钮,就需要将该属性写多次,虽然也能达到相同的效果;但是费力。

<Grid>
        <StackPanel>
            <!-- Button属性 字体大小 字体颜色 内容 控件宽 高 -->
            <Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/>
            <Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/>
            <Button FontSize="20" Foreground="Blue" Content="Hello" Width="100" Height="40"/>
        </StackPanel>
    </Grid>

 效果如下: 

因此,首先想到的是早轮子重复使用。需要通过Style。

创建样式的步骤:

  • 在Window.Resources中创建样式
  • 给每个样式声明一个键Key,一个样式的名称而已
  • 给每个样式声明一个目标类型TargetType,例如Button
  • 设置属性:(Button为例)
  • 字体大小FontSize
  • 背景颜色Background
  • 字体颜色Foreground,边距Margin
  • 水平位置HorizontalAlignment,垂直位置VerticalAlignment

样式是组织和重用以上的重要工具。不是使用重复的标记填充XAML,通过Styles创建一系列封装所有这些细节的样式。它也是模板(Template)、触发器(Trigger)的基础。

    <Window.Resources>
        <Style x:Key="defaultStyle" TargetType="Button">
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Foreground" Value="Blue"/>
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="40"/>
        </Style>
    </Window.Resources>
    
    <Grid>
        <StackPanel>
            <Button Style="{StaticResource defaultStyle}" Content="Hello"/>
            <Button Style="{StaticResource defaultStyle}" Content="Hello"/>
            <Button Style="{StaticResource defaultStyle}" Content="Hello"/>
        </StackPanel>
    </Grid>

 效果如下:

查询Style源代码:

namespace System.Windows
{
    //
    // 摘要:
    //     启用的属性、 资源和事件处理程序的一种类型的实例之间共享。
    [ContentProperty("Setters")]
    [DictionaryKeyProperty("TargetType")]
    [Localizability(LocalizationCategory.Ignore)]
    public class Style : DispatcherObject, INameScope, IAddChild, ISealable, IHaveResources, IQueryAmbient
    {
        //
        // 摘要:
        //     初始化 System.Windows.Style 类的新实例。
        public Style();
        //
        // 摘要:
        //     新实例初始化 System.Windows.Style 类,用于对指定 System.Type。
        //
        // 参数:
        //   targetType:
        //     该样式将应用于哪个类型。
        public Style(Type targetType);
        //
        // 摘要:
        //     新实例初始化 System.Windows.Style 类,用于对指定 System.Type 并根据指定 System.Windows.Style。
        //
        // 参数:
        //   targetType:
        //     该样式将应用于哪个类型。
        //
        //   basedOn:
        //     要基于此样式的样式。
        public Style(Type targetType, Style basedOn);

        //
        // 摘要:
        //     获取一个值,该值指示是否样式是只读的并且不能更改。
        //
        // 返回结果:
        //     true 如果样式密封的;,否则为 false。
        public bool IsSealed { get; }
        //
        // 摘要:
        //     获取或设置此样式所针对的类型。
        //
        // 返回结果:
        //     此样式目标类型。
        [Ambient]
        [Localizability(LocalizationCategory.NeverLocalize)]
        public Type TargetType { get; set; }
        //
        // 摘要:
        //     获取或设置是当前样式的基础已定义的样式。
        //
        // 返回结果:
        //     已定义的样式,其当前样式的基础。 默认值为 null。
        [Ambient]
        [DefaultValue(null)]
        public Style BasedOn { get; set; }
        //
        // 摘要:
        //     获取一套 System.Windows.TriggerBase 应用属性值的对象根据指定的条件。
        //
        // 返回结果:
        //     System.Windows.TriggerBase 对象的集合。 默认值为空集合。
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public TriggerCollection Triggers { get; }
        //
        // 摘要:
        //     获取一套 System.Windows.Setter 和 System.Windows.EventSetter 对象。
        //
        // 返回结果:
        //     一套 System.Windows.Setter 和 System.Windows.EventSetter 对象。 默认值为空集合。
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public SetterBaseCollection Setters { get; }
        //
        // 摘要:
        //     获取或设置此样式的作用域内的可用资源的集合。
        //
        // 返回结果:
        //     可以使用此样式的作用域内的资源。
        [Ambient]
        public ResourceDictionary Resources { get; set; }

        //
        // 摘要:
        //     返回此 System.Windows.Style 的哈希代码。
        //
        // 返回结果:
        //     此 System.Windows.Style 的哈希代码。
        public override int GetHashCode();
        //
        // 摘要:
        //     在当前的名称范围中注册新的名称对象对。
        //
        // 参数:
        //   name:
        //     要注册的名称。
        //
        //   scopedElement:
        //     要映射到指定的对象 name。
        public void RegisterName(string name, object scopedElement);
        //
        // 摘要:
        //     锁定此样式和所有工厂和触发器,使它们不能进行更改。
        public void Seal();
        //
        // 摘要:
        //     从名称范围中移除名称对象映射。
        //
        // 参数:
        //   name:
        //     要删除的映射的名称。
        public void UnregisterName(string name);
    }
}
  • TargetType:Style的作用类型,例如Button。
  • BaseOn:继承已有的样式。
  • TriggerCollection:触发器集合。
  • SetterBaseCollection:属性集合。
  • ResourceDictionary:资源字典,比如笔刷,样式。

样式的作用:样式可以包含多个属性(样式管理属性集合),并批量作用于对象(不用写过多重复代码),也可以用于继承。

    <Window.Resources>
        <Style TargetType="Button">
            <Setter Property="FontSize" Value="25"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Background" Value="Black"/>
            <Setter Property="Content" Value="Button"/>
        </Style>
    </Window.Resources>
    
    <Grid>
        <UniformGrid Columns="3" Rows="3">
            <Button />
            <Button />
            <Button />

            <Button />
            <Button />
            <Button />

            <Button />
            <Button />
            <Button />
        </UniformGrid>
    </Grid>

 效果如下:

给样式起名字,并在作用对象中使用该样式:

    <Window.Resources>
        <Style x:Key="ButtonStyle" TargetType="Button">
            <Setter Property="FontSize" Value="25"/>
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Background" Value="Black"/>
            <Setter Property="Content" Value="Button"/>
        </Style>
    </Window.Resources>
    
    <Grid>
        <UniformGrid Columns="3" Rows="3">
            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>

            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>

            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>
            <Button Style="{StaticResource ButtonStyle}"/>
        </UniformGrid>
    </Grid>

 效果如下: 

样式继承

    <Window.Resources>
        <Style x:Key="baseButtonStyle" TargetType="Button">
            <Setter Property="FontSize" Value="30"/>
            <Setter Property="Foreground" Value="Blue"/>
        </Style>

        <Style x:Key="defaultButtonStyle1" TargetType="Button" BasedOn="{StaticResource baseButtonStyle}">
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="40"/>
        </Style>

        <Style x:Key="defaultButtonStyle2" TargetType="Button" BasedOn="{StaticResource baseButtonStyle}">
            <Setter Property="Width" Value="100"/>
            <Setter Property="Height" Value="50"/>
        </Style>
    </Window.Resources>
    
    <Grid>
        <StackPanel>
            <!-- Button属性 字体大小 字体颜色 内容 控件宽 高 -->
            <Button Style="{StaticResource defaultButtonStyle1}" Content="Hello"/>
            <Button Style="{StaticResource defaultButtonStyle2}" Content="Hello"/>
            <Button Style="{StaticResource defaultButtonStyle2}" Content="Hello"/>
        </StackPanel>
    </Grid>

效果如下: 

控件模板ControlTemplate

视图->其他->文档大纲

右键按钮->编辑模板->编辑副本

产生按钮模板:

<Window.Resources>
        <Style x:Key="FocusVisual">
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Rectangle Margin="2" SnapsToDevicePixels="true" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" StrokeThickness="1" StrokeDashArray="1 2"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
        <SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
        <SolidColorBrush x:Key="Button.Static.Border" Color="#FF707070"/>
        <SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
        <SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
        <SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
        <SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
        <SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
        <SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
        <SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
        <Style x:Key="ButtonStyle1" TargetType="{x:Type Button}">
            <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
            <Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
            <Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            <Setter Property="BorderThickness" Value="1"/>
            <Setter Property="HorizontalContentAlignment" Value="Center"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="Padding" Value="1"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                            <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsDefaulted" Value="true">
                                <Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            </Trigger>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="true">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
                            </Trigger>
                            <Trigger Property="IsEnabled" Value="false">
                                <Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
                                <Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
                                <Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>

Content Presenter使得按钮可以承载很多内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1457835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全综合实验

1.实验拓扑 在这里注意因为第四个要求配置双击热备&#xff0c;我们可以第一时间配置&#xff0c;避免二次重复配置消耗时间 4、FW1和FW3组成主备模式的双机热备 具体配置位置在系统-->高可靠性-->双机热备-->配置 这里上行链路有两组&#xff0c;分别为电信和移动&…

零基础入门金融风控-贷款违约预测Task2 数据分析

Task2 数据分析 此部分为零基础入门金融风控的 Task2 数据分析部分&#xff0c;带你来了解数据&#xff0c;熟悉数据&#xff0c;为后续的特征工程做准备&#xff0c;欢迎大家后续多多交流。 赛题&#xff1a;零基础入门数据挖掘 - 零基础入门金融风控之贷款违约 目的&#…

网站管理新利器:免费在线生成 robots.txt 文件!

&#x1f916; 探索网站管理新利器&#xff1a;免费在线生成 robots.txt 文件&#xff01; 你是否曾为搜索引擎爬虫而烦恼&#xff1f;现在&#xff0c;我们推出全新的在线 robots.txt 文件生成工具&#xff0c;让你轻松管理网站爬虫访问权限&#xff0c;提升网站的可搜索性和…

TLS、运输层安全协议

目录 运输层安全协议 1 协议 TLS 的要点 1.1 协议 TLS 的位置 1.2 TLS 与应用层协议独立无关 1.3 协议 TLS 具有双向鉴别的功能 1.4 TLS 建立安全会话的工作原理 TLS 的握手阶段 TLS 的会话阶段 1.5 TLS 传送的记录格式 2 协议 TLS 必须包含的措施 运输层安全协议 现…

Eclipse - Makefile generation

Eclipse - Makefile generation References right mouse click on the project -> Properties -> C/C Build -> Generate Makefiles automatically 默认会在 Debug 目录下创建 Makefile 文件。 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

反射 动态代理

目录 一、什么是反射&#xff1f; 二、获取class对象的三种方式​编辑 1、Class.forName("全类名")&#xff1b; 2、类名.class 3、对象.getClass()&#xff1b; 4、代码实现 三、反射获取 1、利用反射获取构造方法 ①、示例代码&#xff1a;​编辑 ②、获…

SICTF round#3 web

1.100&#xff05;_upload url可以进行文件包含&#xff0c;但是flag被过滤 看一下源码 <?phpif(isset($_FILES[upfile])){$uploaddir uploads/;$uploadfile $uploaddir . basename($_FILES[upfile][name]);$ext pathinfo($_FILES[upfile][name],PATHINFO_EXTENSION);$t…

vue的十大面试题详情

1 v-show与v-if区别 v-if与v-show可以根据条件的结果,来决定是否显示指定内容&#xff1a; v-if: 条件不满足时, 元素不会存在. v-show: 条件不满足时, 元素不会显示(但仍然存在). <div id"app"><button click"show !show">点我</but…

vue3+ant design 4.x版本遇见message不显示问题。

自己打断点到success&#xff0c;但是就是没有全局显示。 第一看自己的全局引入是否有问题&#xff1a; import { createApp } from vue; import ./style.css; import App from ./App.vue; import Antd from ant-design-vue; import ant-design-vue/dist/reset.css; import ro…

K8s进阶之路-命名空间级-服务发现 :

服务发现&#xff1a; Service&#xff08;东西流量&#xff09;&#xff1a;集群内网络通信、负载均衡&#xff08;四层负载&#xff09;内部跨节点&#xff0c;节点与节点之间的通信&#xff0c;以及pod与pod之间的通信&#xff0c;用Service暴露端口即可实现 Ingress&#…

Top 8 免费 iOS 系统恢复软件榜单

智能手机彻底改变了我们在日常生活中执行任务的方式。这种紧凑的设备结合了移动电话和计算功能。这些移动设备具有出色的功能&#xff0c;例如更强大的硬件潜力和广泛的移动操作流程。此外&#xff0c;无线连接和互联网连接的发展使得这种袖珍设备在全球范围内受到需求。iPhone…

【动态规划专栏】专题一:斐波那契数列模型--------1.第N个泰波那契数

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

※【回溯】【深度优先前序】Leetcode 257. 二叉树的所有路径

※【回溯】【深度优先前序】Leetcode 257. 二叉树的所有路径 解法0 迭代法解法1 深度优先 前序解法2 深度优先 前序 添加了StringBulider ---------------&#x1f388;&#x1f388;257. 二叉树的所有路径 题目链接&#x1f388;&#x1f388;------------------- 解法0 迭代法…

从零开始学逆向:理解ret2libc-3

1.题目信息 题目下载链接&#xff1a;https://pan.baidu.com/s/1wk3JFQBHgVZ0vjfnQk60Ug 提取码&#xff1a;0000 2.解题分析 相对于前面两道例题难度加大了不少&#xff0c;程序中既没有system函数的地址&#xff0c;也没有/bin/sh字符串&#xff0c;我们需要使用libc中的s…

Aspose.Words For JAVA 动态制作多维度表格(涵2024最新无水印包)

全网最全Aspose.Words For JAVA 高级使用教程: CSDNhttps://mp.csdn.net/mp_blog/creation/editor/133989664?spm1000.2115.3001.5352 运行截图&#xff1a; 所谓多维度表格通常包含多个维度, 每个维度都代表一种数据属性,多维度表格可以用于数据分析&#xff0c;通过不同的维…

(十四)devops持续集成开发——jenkins流水线使用pipeline方式发布项目

前言 本节内容我们使用另外一种方式pipeline实现项目的流水线部署发布&#xff0c;Jenkins Pipeline是一种允许以代码方式定义持续集成和持续交付流水线的工具。通过Jenkins Pipeline&#xff0c;可以将整个项目的构建、测试和部署过程以脚本的形式写入Jenkinsfile中&#xff…

给label-studio 配置sam(segment anything)ml 记录

给label-studio 配置sam&#xff08;segment anything&#xff09;ml 后端记录 配置ml后台下载代码下载模型文件创建环境模型转换后端服务启动 配置label-studio 前端配置模型后端连接配置标注模板标注界面使用 参考链接 配置ml后台 下载代码 git clone https://github.com/H…

qt for python创建UI界面

现在很多库都有用到python,又想使用QT creater创作界面&#xff0c;来使用。 1.使用的版本 使用虚拟机安装Ubuntu22.04&#xff0c;Ubuntu使用命令行安装qt,默认安装的是QT5&#xff0c;不用来回调了&#xff0c;就用系统默认的吧&#xff0c;不然安装工具都要费不少事情。pyt…

展示用HTML编写的个人简历信息

展示用HTML编写的个人简历信息 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document…

【前端素材】几款实用的后台管理系统html模板(附带源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…