首页 > 其他分享 >WPF-03 资源之Resources

WPF-03 资源之Resources

时间:2023-02-06 21:14:29浏览次数:43  
标签:03 逻辑 Resource 定义 控件 查找 Resources WPF 资源

  WPF中有两种类型资源Static Resource、Dynamic Resource,资源本质上就是一个对象 。 这节我们主要介绍静态资源
  Static Resource(静态资源)在第一次编译后就确定的值,之后不能修改。FrameworkElement类定义Resource属性,该属性是 ResourceDictionary字典类型, 你可以在该类的任何派生类定义资源,资源字典中的每个键必须是唯一,我们在定义资源时可以通过x:Key指令来分配唯一键

定义资源

<Window x:Class="Example_04.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:Example_04"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <SolidColorBrush x:Key="MyBrush" Color="#05E0E9"/>
        <Style TargetType="Border">
            <Setter Property="Background" Value="#4E1A3D" />
            <Setter Property="BorderThickness" Value="5" />
            <Setter Property="BorderBrush">
                <Setter.Value>
                    <LinearGradientBrush>
                        <GradientStop Offset="0.0" Color="#4E1A3D"/>
                        <GradientStop Offset="1.0" Color="Salmon"/>
                    </LinearGradientBrush>
                </Setter.Value>
            </Setter>
        </Style>
        <Style TargetType="TextBlock" x:Key="lable">
            <Setter Property="HorizontalAlignment" Value="Right"/>
            <Setter Property="Foreground" Value="{StaticResource MyBrush}"/>
            <Setter Property="FontFamily" Value="Arial"/>
        </Style>
        <sys:String x:Key="str">字符创定义</sys:String>
        <sys:Double x:Key="number">100.973</sys:Double>
    </Window.Resources>
    <Border>
        <StackPanel>
            <TextBlock Style="{StaticResource lable}" Text="{StaticResource str}"></TextBlock>
            <TextBlock HorizontalAlignment="Right" FontSize="36" Margin="20" Text="Title">
                <TextBlock.Foreground>
                    <StaticResource ResourceKey="MyBrush"></StaticResource>
                </TextBlock.Foreground>
                <TextBlock.Width>
                    <StaticResource ResourceKey="number"></StaticResource>
                </TextBlock.Width>
            </TextBlock>
            <Ellipse HorizontalAlignment="Center" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="10" />
        </StackPanel>
    </Border>
</Window>

 

 

 在上面代码中我们定义如下资源:

  1. SolidColorBrush表示一把刷子,可以对控件进行绘制
  2. 两个Style样式器,Setter表示选择器,Property表示属性名称、Value表示属性值
  3. 一个字符串对象以及一个数字对象,需要引用如下命名空间
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
  4. 第一种不指定键的两种写法 
    TargetType="Border"和TargetType="{x:Type Border}" 框架会将样式自动应用到目标对象
  5. 第二种需要指定键的两种写法 

    5.1 需要在控件中手动引用资源

              <Style TargetType="TextBlock" x:Key="lable"> 
     5.2 不需要在控件中手动引用资源            
      <Style TargetType="TextBlock" x:Key="{x:Type TextBlock}">
我们也可以在资源中定义一些数据模板DataTemplate和控件模板
ControlTemplate

使用资源

可以使用如下两种语法使用资源(参考上面代码已经覆盖这两种写法):

<!--第一种-->
<object property="{StaticResource key}" ... />
<!--第二种-->
<object>  
  <object.property>  
     <StaticResource ResourceKey="key" ... />  
  </object.property>  
</object>

查找资源

   控件在查找资源时,先查找控件自己的Resource属性,如果没有找到,控件会沿着逻辑树向上一级进行查找,如果在当前页面的顶级UI元素的资源中没有找到,程序会查找<Application.Resources/>(也就是应用程序的顶级资源)。如果仍然没有找到,应用程序就会抛出异常

  在这里引出两个概念:

  逻辑树(Logical Tree):逻辑树是由每个控件的节点组成,本质上就是XAML文件中的UI元素
  可视化树(Visual Tree):  可视化树是逻辑树的一种扩展,逻辑树的每个结点都被分解为核心视觉组件,逻辑树节点对我们来说是个黑箱,而视觉树暴露了视觉的实现细节

  想要更快更方便的了解相关知识,可以关注微信公众号 

 

 

标签:03,逻辑,Resource,定义,控件,查找,Resources,WPF,资源
From: https://www.cnblogs.com/axzxs2001/p/17096680.html

相关文章

  • 南阳理工--103背包问题
    背包问题难度:3描述现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就......
  • pycharm格式的正则替换key:value到‘key’:'value',
    CTRL+R进入替换......
  • CF1137F Matches Are Not a Child's Play 题解
    以最后被删去的点为根,这样子不会存在从父亲然后删掉某个点,儿子的删除顺序一定比父亲前。记每个点子树中的最大值为\(f_x\),那么一个点的排名,首先就需要加上\(<f_x\)的所......
  • WPF-06 样式(Style)
    在我们前面介绍资源的时候,我们提到了样式表,如果你之前是做Web开发的,你会发现Style有点类似于Web中的CSS。控件级别样式我们可以在控件级别定义自己的样式,控件级......
  • WPF-06 样式(Style)
    在我们前面介绍资源的时候,我们提到了样式表,如果你之前是做Web开发的,你会发现Style有点类似于Web中的CSS。控件级别样式我们可以在控件级别定义自己的样式,控件级......
  • numpy的用法-03
    #coding=utf-8importnumpyasnpimportnumpyaspia=np.arange(15).reshape(3,5)#arange����0-14������reshape���3*5�ľ���print(a)print(a.shape)#输出行和列的长度print(a.ndim)#t......
  • JAVAHOME的配置--Java基础003
    有时候可能需要更换Jdk的目录,但是经常修改path的值可能会不小心修改其他的路径,解决方法:1、 创建一个JAVA_HOME的变量。 2、 JAVA_HOME的值为JDK的安装目录。3、配置path......
  • AttributeError: module 'argparse' has no attribute 'ArgumentParser'
      原因是我的文件名和包名一样了,修改下python的文件名即可。   ......
  • Python3 ImportError: No module named '_tkinter'
    Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"/usr/local/lib/python3.5/tkinter/__init__.py",line35,in<module>import_tkinter#......
  • vscode部署Vue项目时遇到Expected linebreaks to be 'LF' but found 'CRLF'解决
    小白第一次部署vue大项目,在vscode上进行。项目是完善的,我需要在此基础上添加功能,首先得在本地部署。(遇到了一些小问题,仅用于个人踩坑记录~)1.cnpm与npm问题npmnmp(节点包管理......