(六)WPF - 资源和样式行为(1)

news/2023/11/28 18:04:09

一、资源

1、资源集合

每个元素都有一个 Resources 属性,该属性存储了一个资源字典集合(它是 Resource Dictionary 类的实例)。资源集合可以包含任意类型的对象,并根据字符串编写索引。

为了使用 XML 标记中的资源,需要一种引用资源的方法。这是通过标记扩展完成的。
有两个标记扩展可供使用:一个用于动态资源,另一个用于静态资源。

静态资源: 在第一次创建窗口时一次性地设置完毕。
动态资源: 如果发生了改变,则会重新应用资源。

2、资源的层次

每个元素都有自己的资源集合,并且为了找到期望的资源, WPF 在元素树中进行递归搜索。

使用静态资源时,必须总是在引用资源之前在标记中定义资源。

<Window.Resources>
<ImageBrush x:Key="TileBrush" TileMode="Tile"ViewportUnits="Absolute" Viewport" 0 0 32 32"ImageSource = "happyface.jpg" opacity="0.3"></ImageBrush>
</Window.Resources>
....

3、访问二进制资源

二进制资源如图片等信息。

<Image Height="21" Source="test.png"

System.Windows.Controls.Image 是一种很方便的访问每一个二进制图像的控件。
Image 类有一个 Source 属性,类型是 System.Windows.Media.ImageSource。

如果把资源变为松散文件,不想把它加入到项目中来。
<Image Height="21" Source="c:\User\Adam\Doucments\test.png"/>
从部署位置访问资源
<Image Height="21" Source="pack://application:,,,/Resources/Image/test.png"/>
<Image Height="21" Source="pack://siteOfOrigin:,,,/Resources/Image/test.png"

4、静态资源和动态资源

WPF 提供了两种访问逻辑资源的方式:

  • 一种静态的,由 StaticResource 实现,这种资源仅会被应用一次(第一次需要资源时加载)。
  • 一种是动态资源,由 DynamicResource 实现,这种资源每次更改时都会被重新应用。

两者区别:

  • 静态资源只从资源集合中获取对象一次。

  • 动态资源在每次需要对象时都会重新从资源集合中查找对象。

  • 动态资源需要占用更多的资源。

  • 使用动态资源可以改善加载时间,对静态资源的引用总是发生在 Window 或 Page 加载之后,而对动态资源的引用要到实际使用时才会生效。

  • 动态资源只能用于设置依赖属性值,而静态资源可以在任何地方使用。

  • 静态资源必须在 XMAL 文件中声明之后才可以使用,而动态资源没有限制。

第一次加载时的性能:

  • 动态资源在第一次使用它们时加载,而静态资源总是在创建窗口时加载。(因此,动态资源还被用于提高第一次加载时的性能)

明显的例子:
当创建依赖于 Windows 设置(例如系统颜色)的资源时。对于这种情况,如果希望能够相应当前颜色方案的任何改变,就需要使用动态资源。否则,如果使用静态资源,将仍然使用原来的颜色方案,直到用户重新启动应用程序为止。

使用动态属性时:

  • 资源具有依赖于系统设置的属性(如当前 Windows 操作系统的颜色或字体)。
  • 计划通过编程替换资源对象(例如,实现几类动态皮肤特性。)

5、非共享资源

当在多个地方使用某种资源时,使用的是同一个对象实例。这种行为——被称为共享。
而希望解释器在每次使用时创建单独的对象实例,就要关闭共享行为。

<ImageBrush x:Key="TileBrush" x Shared="False"...></ImageBrush>

二、样式

<Window.Resources>
<Sytle x:Key="BigFontButtonStyle">
<Setter Property="Control.FontFamily" Value="Times New Roman"/>
<Setter Property="Control.FontSize" Value="18"/>
<Setter Property="Control.FontWeight" Value="Bold"/>
</Style>
</Window.Resources>

表-Sytel 类的属性

属性说明
Setters设置属性值以及自动关联事件处理程序的 Setter 对象或 EventSetter 对象的集合
Triggers继承自 TriggerBase 类并且能够自动改变样式设置的对象的集合。例如,当另一个属性改变时,或者当发生某个事件时,可以修改样式
Resources希望用于样式的资源集合。例如,可能需要使用一个对象设置多个属性。这时,作为资源创建对象,然后再在 Setter 对象中使用该资源,这样会更搞笑(而不是使用嵌套的标签作为每个 Setter 对象的一部分创建对象)
BasedOn通过该属性可以创建继承自(并且可以有选择地进行重写)其他样式设置的更复杂样式
TargetType该属性标识应用样式的元素的类型。通过该属性可以创建只影响特定类型元素的设置器,并且还可以创建能够为恰当的元素类型自动起作用的设置器

1、Setter设置属性

    <Window.Resources><Style x:Key="BigFontButtonStyle" TargetType="Button"><Setter Property="FontFamily" Value="Times New Roman"/><Setter Property="FontSize" Value="24"/><Setter Property="FontWeight" Value="Bold"/><Setter Property="Foreground" Value="Blue"/></Style></Window.Resources><StackPanel><Button x:Name="btn" Content="测试按钮" Width="100" Height="100" Style="{StaticResource BigFontButtonStyle}" ></Button></StackPanel>

2、EventSetter 处理事件程序

    <Window.Resources><Style x:Key="CustomTextBlockStyle" TargetType="TextBlock"><Setter Property="Foreground" Value="Blue"/><EventSetter Event="TextBlock.MouseEnter"Handler="TextBlock_MouseEnter"/><EventSetter Event="TextBlock.MouseLeave"Handler="TextBlock_MouseLeave"/></Style></Window.Resources><StackPanel><TextBlock x:Name="tbTest" Text="测试" FontSize="30"  Style="{StaticResource CustomTextBlockStyle}" /></StackPanel>

cs 代码:

 private void TextBlock_MouseEnter(object sender,MouseEventArgs e){tbTest.Foreground = new SolidColorBrush(Colors.Wheat);}private void TextBlock_MouseLeave(object sender, MouseEventArgs e){tbTest.Foreground = new SolidColorBrush(Colors.Blue);}

3、BasedOn 继承样式

    <Window.Resources><Style x:Key="BasedTextBlockStyle" TargetType="TextBlock"><Setter Property="Foreground" Value="Blue"/><Setter Property="FontWeight" Value="Bold"/><Setter Property="FontSize" Value="30"/></Style><Style x:Key="CustomTextBlockStyle" TargetType="TextBlock" BasedOn="{StaticResource BasedTextBlockStyle}"><Setter Property="Foreground" Value="Black"/></Style></Window.Resources><StackPanel><TextBlock x:Name="tbTest" Text="测试" FontSize="30"  Style="{StaticResource CustomTextBlockStyle}" /></StackPanel>

4、Triggers

    <Window.Resources><Style x:Key="CustomBtnStyle" TargetType="{x:Type Button}"><Setter Property="Background" Value="#273c62"/><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="IsMouseOver" Value="true"><Setter Property="Background" TargetName="border" Value="#660000ff"/></Trigger><Trigger Property="IsPressed" Value="true"><Setter Property="Background" TargetName="border" Value="#55ff0000"/></Trigger><Trigger Property="IsEnabled" Value="false"><Setter Property="Background" TargetName="border" Value="#33000000"/><Setter Property="Opacity" TargetName="contentPresenter" Value="0.5"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></Window.Resources><StackPanel><Button x:Name="btnTest" Content="测试" FontSize="30"  Style="{StaticResource CustomBtnStyle}" /></StackPanel>

http://www.ppmy.cn/news/536389.html

相关文章

C++ 自己动手实现简单的文件操作 (2023.6.23)

C 自己动手实现简单的文件操作 2023.6.23 引言1、文件简介2、各式各样的文件格式2.1 不同类型文件的扩展名2.1.1 文本文件2.1.2 数据文件2.1.3 音频文件2.1.4 视频文件2.1.5 电子书文件2.1.6 3D图像文件2.1.7 位图文件2.1.8 矢量图文件2.1.9 相机原始文件2.1.10 页面布局文件2.…

KDE窗宽选择中的最小二乘交错间定法

窗宽参数的选择方法, 一般有经验法, 插入法, 交错鉴定法等方法. 以下介绍最小二乘交错鉴定法, 并将其作为本文的窗宽选择方法. 最小二乘交错鉴定法(Least-squares cross-validation&#xff0c;LSCV)是是基于这样的思想, 即选取的窗宽参数值能够最小化估计函数的积分平方误差.…

洗地机哪个牌子好性价比高又实惠、2023年最好用的洗地机

家用洗地机是现代家庭清洁的必备工具之一&#xff0c;它能够快速、高效地清洁地面&#xff0c;让家庭环境更加整洁、卫生。随着科技的不断进步&#xff0c;家用洗地机的功能和性能也越来越强大&#xff0c;市场上的选择也越来越多样化。但是&#xff0c;如何选择一款适合自己家…

自监督对比学习框架SimCLR原理

目录 一、前言 人工智能发展近况 对比学习 二、数据集介绍 STL-10数据集 三、无监督图像表征对比学习 SimCLR SimCLR算法基本原理 数据增强与正负样本匹配 编码器 损失函数 对比学习全过程 四、有监督的图像下游任务迁移 替换下游任务网络层 有监督训练 五、实…

3 python进阶篇

文章目录 面向对象类属性和类方法类属性类方法静态方法 单例模式__new__ 方法类实现单例模式 异常 、模块和包异常自定义异常 模块和包模块的搜索顺序包的init文件发布模块&#xff08;了解&#xff09; 文件seek文件/目录的常用管理操作eval函数 补充性知识位运算小技巧 参考我…

计算机用户密码怎么查看,怎么查看电脑开机密码【具体阐明】

很多小伙伴都遇到过怎么查看电脑开机密码的困惑吧&#xff0c;一些朋友看过网上零散的怎么查看电脑开机密码的处理方法&#xff0c;并没有完完全全明白怎么查看电脑开机密码是如何解决的&#xff0c;今天小编准备了简单的解决办法&#xff0c;只需要按照1&#xff1a;重启电脑&…

SVN 查看用户名密码

项目场景&#xff1a; a bitter loser,没有遇到难题和问题更多是的需求&#xff0c;没和代码相关&#xff0c;有点失落。 问题描述 有点失落。。。NO&#xff0c;&#xff0c;如何查看SVN的对应的用户名和密码呢&#xff1f; 默认路径C:\Users\Administrator\AppData\Roamin…

怎么查看mysql密码_怎么查看mysql密码

MySQL数据库查看密码的方法如下&#xff1a; 以系统管理员身份运行cmd. 查看mysql是否已经启动&#xff0c;如果已经启动&#xff0c;就停止&#xff1a;net stop mysql. 切换到MySQL安装路径下&#xff1a;D:\WAMP\MySQL-5.6.36\bin&#xff1b;如果已经配了环境变量&#xff…

Redis查看当前密码

工具&#xff1a;命令提示符&#xff08;cmd&#xff09; 环境&#xff1a;Windows10 安装redis后&#xff0c;如果不设置密码&#xff0c;基本上密码默认是空&#xff0c;如果不放心&#xff0c;那就查看一下当前密码。 1.首先在搜索框中输入cmd&#xff0c;打开命令提示符工…

查看svn账号密码

参考他人链接&#xff1a;https://blog.csdn.net/Amnesiac666/article/details/121355958 1.找到svn存放目录 窝的本地&#xff1a;C:\Users\lenovo\AppData\Roaming\Subversion\auth\svn.simple 如果找不到直接搜索svn.simple&#xff08;需要时间&#xff09; 2.下载密码…

手机android wifi的密码查看,手机怎么查看wif无线i密码?安卓手机忘记无线i密码查看方法...

手机wifi密码怎么查看&#xff1f;怎么查看已连接的wifi密码&#xff1f;即便手机已经成功连接WiFi&#xff0c;但是很多时候&#xff0c;我们并不知WiFi的密码。如果你想要查看WiFi密码该怎么办呢&#xff1f;这里教大家手机WiFi密码查看方法。 手机Wifi密码怎么查看 手机Wifi…

网页中保存的密码查看方法

前言 我们经常会在网页中保存一些常用的密码&#xff0c;如果忘记之后想知道密码只能通过修改密码&#xff0c;可能比较麻烦。使用这个方法&#xff0c;可以&#xff0c;查看屏幕上本来是点状的密码。 正文 在原本是点状密码输入框的位置右键 点击检查 在右侧高亮的文本中…

【navicat 密码查看】小技巧navicat 如何查看密码

时间久了&#xff0c;当我们以前连上了navicat 之后&#xff0c;密码忘记了&#xff0c;但是依然能连接&#xff0c;此时我们想查看密码&#xff0c;应该如何操作呢&#xff1f; 步骤1&#xff1a;点击navicat 文件选项&#xff0c;导出连接&#xff0c;勾选需要导出的数据库&…

网页自动保存的密码忘记 如何查看密码

网页自动保存的密码忘记 如何查看密码 查看网页自动保存的密码 查看网页自动保存的密码 有时候一些经常需要登录的网页&#xff0c;我们会选择保存密码或者网页自动记住密码&#xff0c;直接复制又没法复制&#xff0c;下面介绍一种简单的查看密码的方法。 首先我们打开自动记…

ftp等远程登录工具的星号密码查看方法

当我们在使用ftp&#xff0c;或者xshell等远程登录工具的时候&#xff0c;连接的密码是用星号*处理的&#xff0c;无法查看到&#xff0c;该如何查看到原始的密码呢&#xff1f; 推荐一款星号密码查看器&#xff0c;可以查看一些软件的带星号的密码&#xff0c;非常好用。 下…

Mysql5.7默认密码_MySQL5.7初始密码查看及重置

安装了mysql5.7之后初始密码不再默认为空 1.查看初始密码&#xff1a; [rootVM_225_102_centos ~]# grep temporary password /var/log/mysqld.log 2016-07-08T02:25:46.311098Z 1 [Note] A temporary password is generated for rootlocalhost: MtPqF0/oN5zo 即初始密码为 MtP…

ftp服务器显示密码,Ftp服务器怎么查看密码

Ftp服务器怎么查看密码 内容精选 换一换 Windows操作系统的裸金属服务器在创建时只能选择密钥鉴权方式,想使用密码方式登录,有两种方法可以获取密码:将密钥文件解析为密码,参考链接:获取Windows裸金属服务器的密码通过控制台的重置密码功能设置密码,参考链接:重置裸金属…

查看mysql临时密码_MySQL修改密码,查看MySQL临时密码

一、查看MySQL临时密码 Linux安装好MySQL后,为了增加数据库的安全性,在安装时会为root用户生成一个临时的随机密码,存放在/var/log/mysqld.log 中。 [root@localhost mysql_bundle]# cat /var/log/mysqld.log | grep temp 2020-05-12T12:05:15.901037Z 1 [Note] A temporary…

【windows密码查看】在windows系统中保存的windows凭据如何方便地查看?network_password_recovery

一、问题背景 假设你以前通过局域网的windows凭据功能连接上了另一台机器&#xff0c;但是你忘记了另一台机器的密码&#xff1b;想通过本地保存的数据查看&#xff0c;无奈windows系统不提供直接查看的服务。 web凭据可以直接查看&#xff0c;而windows凭据的密码安全等级更…

密码找回、带星号密码查看解决方案

1、摘要 从win7迁移到mac&#xff0c;在mac上配置foxmail时&#xff0c;发现邮箱账号记得&#xff0c;密码忘记&#xff0c;还有几个其它应用也是账号记得&#xff0c;密码忘记。于是便寻解决方案&#xff0c;不外乎3个方案&#xff1a;应用本身自带的密码找回功能&#xff0c…
最新文章