WPF系列教程(二十六):资源基础Resource的定义及使用,动态资源、静态资源、系统资源

wpf资源是为了存储一系列我们常复用的对象。每个元素都有Resource属性。项目源码

资源的定义与使用

下面的例子使用一张笑脸图片定义一个画刷,定义成静态资源并在按钮背景属性上使用(使用元素属性定义):

<Window.Resources>
    <ImageBrush x:Key="TileBrush" TileMode="Tile" ViewportUnits="Absolute" Viewport="0 0 32 32" ImageSource="/true.jpg">
    </ImageBrush><!--定义了一个笑脸画刷资源-->
</Window.Resources>
<Button Height="30" Background="{StaticResource TileBrush}" Name="btn1" Margin="5" Content="一个平铺的按钮" Foreground="Red" FontWeight="Bold">
</Button> <!--使用资源用StaticResource-->
<Button Height="30" Name="btn2" Margin="5" Content="">
</Button>
<Button Height="30" Name="btn3" Margin="5" Content="1" Background="{DynamicResource TileBrush}">
</Button>

效果如下:
在这里插入图片描述

也可以把资源放在上一级StackPannel中或者直接放在Button里面,在使用静态资源之前一定要事先定义好资源,动态资源则可以放前也可以放后:

<StackPanel.Resources>
    <ImageBrush x:Key="TileBrush" TileMode="Tile" ViewportUnits="Absolute" Viewport="0 0 30 30" ImageSource="/true.jpg">
    </ImageBrush>
    <!--定义了一个笑脸画刷资源-->
</StackPanel.Resources>

如果把资源放在所有的Button后面,只有动态资源可以使用,静态资源则找不到对应的key,程序会触发异常。
在元素内部定义资源:

<Button Height="30" Name="btn1" Margin="5" Content="一个平铺的按钮" Foreground="Red" FontWeight="Bold">
    <Button.Resources>
        <ImageBrush x:Key="TileBrush" TileMode="Tile" ViewportUnits="Absolute" Viewport="0 0 30 30" ImageSource="/true.jpg">
        </ImageBrush>
        <!--定义了一个笑脸画刷资源-->
    </Button.Resources>
    <Button.Background>
        <StaticResource ResourceKey="TileBrush"> 
        </StaticResource>
    </Button.Background>
</Button> <!--使用资源用StaticResource-->

由于资源必须先定义,Background使用资源必须放在后面,采用元素属性的方式使用资源。

静态资源

只能从资源集合中获取对象一次,也就是说,第一次加载的时候就固定下来了,以后我再更改资源也不会对使用静态资源的元素产生什么影响。

动态资源

每次使用资源时都会重新获取,使用动态资源的元素会发生改变。
下面这个案例说明静态资源和动态资源的区别:
第一个按钮使用了静态资源,第二个按钮按下会改变资源,第三个按钮使用了动态资源。
当我们单击资源改变按钮时,静态资源按钮不会发生改变,动态资源按钮随着资源改变更新了。

private void btn2_Click(object sender, RoutedEventArgs e)
{
    
    
    this.stackPannel1.Resources["TileBrush"] = new SolidColorBrush(Colors.LightBlue);
}
<StackPanel Margin="5" Name="stackPannel1">
    <StackPanel.Resources>
        <ImageBrush x:Key="TileBrush" TileMode="Tile" ViewportUnits="Absolute" Viewport="0 0 30 30" ImageSource="/true.jpg">
        </ImageBrush>
        <!--定义了一个笑脸画刷资源-->
    </StackPanel.Resources>
    <Button Height="30" Name="btn1" Margin="5" Content="使用静态资源" Foreground="Red" FontWeight="Bold">
        <!--<Button.Resources>
            <ImageBrush x:Key="TileBrush" TileMode="Tile" ViewportUnits="Absolute" Viewport="0 0 30 30" ImageSource="/true.jpg">
            </ImageBrush>
            --><!--定义了一个笑脸画刷资源--><!--
        </Button.Resources>-->
        <Button.Background>
            <StaticResource ResourceKey="TileBrush"> 
            </StaticResource>
        </Button.Background>
    </Button> <!--使用资源用StaticResource-->
    <Button Height="30" Name="btn2" Margin="5" Content="改变画刷" Foreground="Red" FontWeight="Bold" Click="btn2_Click">
    </Button>
    <Button Height="30" Name="btn3" Margin="5" Background="{DynamicResource TileBrush}" Content="使用动态资源" FontWeight="Bold" Foreground="Red">
    </Button>
    
</StackPanel>

在这里插入图片描述
以上案例反应了动态资源与静态资源的区别。
当我们要根据windows自动响应资源时,资源依赖于系统属性,使用动态皮肤特性时,一般用动态资源。

应用程序资源

如果Windows中找不到需要的资源,资源会向上寻找直到App.xaml文件中。
以下这种把资源放入Application应用程序中时也可以实现同样的效果。
在这里插入图片描述
但是应用程序资源并非资源寻找的最后一站,如果应用程序中仍然不能找到,则会进入资源寻找的最后一阶段——系统资源。
设置前景色跟随系统:

Foreground="{x:Static SystemColors.WindowTextBrush}"

若要设置元素颜色随着系统更改而改变,需要用到动态资源:

Foreground="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"

Guess you like

Origin blog.csdn.net/qq_43511299/article/details/121625240