在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>