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}}"