WPF筆記4——靜態資源(StaticResource)

青云Zeo發表於2024-11-26

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

相關文章