WPF笔记4——静态资源(StaticResource)
在WPF中,资源(Resource)是一种存储和共享对象的方式,可以在应用程序的不同部分之间重用。
在WPF中,有两种资源引用方式:静态资源(StaticResource)和动态资源(DynamicResource)
静态资源(StaticResource)
静态资源,用于在xaml加载时解析并应用资源。它通常用于引用在资源字典中定义的对象,如样式、颜色、控制模板等。
因为资源只查找一次,并且是在加载时确定的,所以性能较好。
1、在Window.Resources中的静态资源
点击查看代码
<Window x:Class="TestWPF.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:local="clr-namespace:TestWPF"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<!--
定义两个 SolidColorBrush 资源;
x:Key为xaml中定义的资源提供唯一的标识
-->
<SolidColorBrush x:Key="MyPinkBrush" Color="Pink"/>
<SolidColorBrush x:Key="MyGreenBrush" Color="LightGreen"/>
</Window.Resources>
<StackPanel>
<!--
定义两个button,button背景色使用上面定义的SolidColorBrush资源
在xaml元素中使用{StaticResource ResourceKey}语法来引用资源;
ResourceKey是资源在资源字典中的键
-->
<Button Content="Ok"
Margin="10"
Background="{StaticResource MyPinkBrush}" />
<Button Content="Cancel"
Margin="10"
Background="{StaticResource MyGreenBrush}"/>
</StackPanel>
</Window>
2、在Application.Resources中的静态资源
2.1在Application.xaml文件中定义Style,具体如下:
点击查看代码
<Application x:Class="TestWPF.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestWPF"
StartupUri="MainWindow.xaml">
<Application.Resources>
<SolidColorBrush x:Key="MyColorBrush" Color="LightSalmon"/>
<!--
没有定义x:key的样式是隐式样式(implicit style);
那么程序中的TargetType类型控件默认都使用此Style
-->
<Style TargetType="Button">
<Setter Property="FontSize" Value="16"/>
<Setter Property="Width" Value="200"/>
<Setter Property="Height" Value="80"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="Background" Value="LemonChiffon"/>
<Setter Property="Foreground" Value="{StaticResource MyColorBrush}"/>
<Setter Property="Tag" Value="default Style"/>
</Style>
<!--定义Button的基本颜色-->
<Style x:Key="BaseStyle"
TargetType="Button">
<Setter Property="Background" Value="LightGreen"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="Width" Value="200"/>
<Setter Property="Height" Value="50"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="Foreground" Value="White"/>
</Style>
<!--继承上面的BaseStyle,再定义一个Button的Style-->
<Style x:Key="MyButtonStyle"
TargetType="Button"
BasedOn="{StaticResource BaseStyle}"
>
<Setter Property="Background" Value="{StaticResource MyColorBrush}"/>
<Setter Property="BorderThickness" Value="5"/>
<Setter Property="BorderBrush" Value="Green"/>
<Setter Property="Foreground" Value="Black"/>
</Style>
</Application.Resources>
</Application>
2.2、在MainWindow中使用上面定义的Style
点击查看代码
<Window x:Class="TestWPF.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:local="clr-namespace:TestWPF"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" >
<StackPanel>
<Button Content="使用隐式样式"/>
<Button Content="BaseStyle样式" Style="{StaticResource BaseStyle}"/>
<Button Content="MyButtonStyle样式" Style="{StaticResource MyButtonStyle}"/>
<!--通过x:Null设置Button不使用隐式样式-->
<Button Content="不使用任何样式" Style="{x:Null}"/>
</StackPanel>
</Window>
3、使用资源字典
3.1、添加资源字典文件
3.2、在资源字典文件中添加资源信息
点击查看代码
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<!-- 定义SolidColorBrush资源 -->
<SolidColorBrush x:Key="MyColorBrush" Color="LightSalmon"/>
<!--
没有定义x:key的样式是隐式样式(implicit style);
那么程序中的TargetType类型控件默认都使用此Style
-->
<Style TargetType="Button">
<Setter Property="FontSize" Value="16"/>
<Setter Property="Width" Value="200"/>
<Setter Property="Height" Value="80"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="Background" Value="LemonChiffon"/>
<Setter Property="Foreground" Value="{StaticResource MyColorBrush}"/>
<Setter Property="Tag" Value="default Style"/>
</Style>
<!--定义Button的基本颜色-->
<Style x:Key="BaseStyle"
TargetType="Button">
<Setter Property="Background" Value="LightGreen"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="Width" Value="200"/>
<Setter Property="Height" Value="50"/>
<Setter Property="Margin" Value="10"/>
<Setter Property="Foreground" Value="White"/>
</Style>
<!--继承上面的BaseStyle,再定义一个Button的Style-->
<Style x:Key="MyButtonStyle"
TargetType="Button"
BasedOn="{StaticResource BaseStyle}"
>
<Setter Property="Background" Value="{StaticResource MyColorBrush}"/>
<Setter Property="BorderThickness" Value="5"/>
<Setter Property="BorderBrush" Value="Green"/>
<Setter Property="Foreground" Value="Black"/>
</Style>
</ResourceDictionary>
3.3、在Application.Resource中合并资源字典
- 打开Application.xaml文件
- 在Application.Resource中使用<ResourceDictionary.MergedDictionaries>元素来合并上面创建的资源字典。这样在应用程序级别就可以共享这些资源了;
例如:
3.4、在Window.Resource中合并资源字典
打开需要使用资源的窗口对应的xaml文件;
在Window.Resource中使用与上面相同的方式来合并资源字典
例如:
点击查看代码
<Window x:Class="TestWPF.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:local="clr-namespace:TestWPF"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800" >
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="./MyStyleResource/Dictionary_ButtonStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<StackPanel>
<!--使用资源字典中的样式-->
<Button Content="使用隐式样式"/>
<Button Content="BaseStyle样式" Style="{StaticResource BaseStyle}"/>
<Button Content="MyButtonStyle样式" Style="{StaticResource MyButtonStyle}"/>
<!--通过x:Null设置Button不使用隐式样式-->
<Button Content="不使用任何样式" Style="{x:Null}"/>
</StackPanel>
</Window>