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>

posted @ 2024-11-26 11:50  青云Zeo  阅读(75)  评论(0编辑  收藏  举报