WPF - 资源

  • 简述

    资源通常是与您预期会更频繁使用的某个对象相关联的定义。它能够为控件或当前窗口在本地存储数据,或为整个应用程序全局存储数据。
    将对象定义为资源允许我们从另一个地方访问它。这意味着该对象可以被重用。资源在资源字典中定义,任何对象都可以有效地定义为资源,使其成为可共享的资产。为 XAML 资源指定了唯一键,使用该键,可以使用 StaticResource 标记扩展来引用它。
    资源可以有两种类型-
    • 静态资源
    • 动态资源
    StaticResource 是一次性查找,而 DynamicResource 更像是数据绑定。它记住一个属性与一个特定的资源键相关联。如果与该键关联的对象发生更改,动态资源将更新目标属性。
  • 示例

    这是 SolidColorBrush 资源的简单应用程序。
    • 让我们创建一个名为 WPFResouces 的新 WPF 项目。
    • 拖动两个矩形并设置它们的属性,如以下 XAML 代码所示。
    
    <Window x:Class = "WPFResources.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:WPFResources" 
       mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "525"> 
         
       <Window.Resources> 
          <SolidColorBrush x:Key = "brushResource" Color = "Blue" /> 
       </Window.Resources> 
         
       <StackPanel> 
          <Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}" /> 
          <Rectangle Height = "50" Margin = "20" Fill = "{DynamicResource brushResource}" /> 
          <Button x:Name = "changeResourceButton"
             Content = "_Change Resource" Click = "changeResourceButton_Click" /> 
       </StackPanel> 
         
    </Window> 
    
    • 在上面的XAML代码中,可以看到一个矩形有StaticResource,另一个有DynamicResource,brushResource的颜色是Bisque。
    • 当你编译执行代码时,会产生如下主窗口。
    资源主窗口
    当你点击“更改资源”按钮时,你会看到带有 DynamicResource 的矩形将其颜色变为红色。
    更改资源
  • 资源作用域

    资源在资源字典中定义,但是有很多地方可以定义资源字典。在上面的示例中,资源字典是在窗口/页面级别定义的。在哪个字典中定义资源会立即限制该资源的作用域。所以作用域,即你可以在哪里使用资源,取决于你在哪里定义它。
    • 在网格的资源字典中定义资源,该资源只能由该网格及其子元素访问。
    • 在窗口/页面上定义它,该窗口/页面上的所有元素都可以访问它。
    • 可以在 App.xaml 资源字典中找到应用根目录。它是我们应用程序的根,所以这里定义的资源作用域是整个应用程序。
    就资源的作用域而言,最常见的是应用程序级别、页面级别和特定元素级别,如 Grid、StackPanel 等。
    资源作用域
    上述应用程序在其窗口/页面级别具有资源。
  • 资源字典

    XAML 应用程序中的资源字典暗示 res我们的字典保存在单独的文件中。几乎所有 XAML 应用程序都遵循它。在单独的文件中定义资源可以具有以下优点 -
    • 资源字典中定义资源与UI相关代码的分离。
    • 在单独的文件(例如 App.xaml)中定义所有资源将使它们在整个应用程序中可用。
    那么,我们如何在单独的文件中的资源字典中定义我们的资源呢?好吧,这很容易,只需按照以下步骤通过 Visual Studio 添加一个新的资源字典 -
    • 在您的解决方案中,添加一个新文件夹并将其命名为 ResourceDictionaries
    • 右键单击该文件夹并从 Add 子菜单项中选择 Resource Dictionary 并将其命名为 DictionaryWithBrush.xaml

    示例

    我们现在举同样的例子,但在这里,我们将在应用级别定义资源字典。 MainWindow.xaml 的 XAML 代码如下 -
    
    <Window x:Class = "WPFResources.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:WPFResources" 
       mc:Ignorable = "d" Title = "MainWindow" Height = "350" Width = "525"> 
         
       <StackPanel> 
          <Rectangle Height = "50" Margin = "20" Fill = "{StaticResource brushResource}" /> 
          <Rectangle Height = "50" Margin = "20" Fill = "{DynamicResource brushResource}" /> 
          <Button x:Name = "changeResourceButton"
             Content = "_Change Resource" Click = "changeResourceButton_Click" /> 
       </StackPanel> 
         
    </Window>
    
    这里是 DictionaryWithBrush.xaml 中的实现 -
    
    <ResourceDictionary xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"> 
         
       <SolidColorBrush x:Key = "brushResource" Color = "Blue" /> 
    </ResourceDictionary> 
    
    这是 app.xaml 中的实现 -
    
    <Application x:Class="WPFResources.App" 
       xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
       StartupUri = "MainWindow.xaml"> 
         
       <Application.Resources> 
          <ResourceDictionary Source = " XAMLResources\ResourceDictionaries\DictionaryWithBrush.xaml"/> 
       </Application.Resources> 
         
    </Application> 
    
    当上面的代码编译执行后,会产生如下输出-
    资源字典输出
    当您点击更改资源按钮时,矩形将其颜色变为红色。
    更改资源字典
    我们建议您执行上述代码并尝试更多资源(例如背景颜色)。