Wpf 简明教程

WPF - Resources

资源通常与某个对象相关的定义,而您期望对该对象重复使用。它具有将数据存储在控件或当前窗口中(本地存储)或针对整个应用程序进行全局存储的能力。

将某个对象定义为资源允许我们从其他地方访问该对象。这意味着该对象可以重用。资源在资源词典中进行定义,任何对象都可以定义为资源,从而有效地使其成为可共享资产。唯一的键指定给 XAML 资源,通过此键可以利用 StaticResource 标记扩展进行引用。

资源可以分为两种类型 −

  1. StaticResource

  2. DynamicResource

StaticResource(静态资源)是一次性查找,而 DynamicResource(动态资源)的工作方式更加类似于数据绑定。它记住某个属性与特定的资源键相关联。如果与该键关联的对象发生更改,动态资源将更新目标属性。

Example

以下是一个 SolidColorBrush 资源的简单应用程序。

  1. 使用名称 WPFResouces 创建一个新的 WPF 项目。

  2. 拖动两个 Rectangles,并按照以下 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>
  1. 在上述 XAML 代码中,您可以看到一个矩形有 StaticResource,另一个有 DynamicResource,并且 brushResource 的颜色为淡黄色。

  2. 当您编译并执行此代码时,它将产生以下 MainWindow。

main window of resources

当您单击“更改资源”按钮时,您将看到具有 DynamicResource 的矩形变为红色。

change resources

Resource Scope

资源在 resource dictionaries 中进行定义,但可以在许多地方定义资源词典。在上述示例中,资源词典在 Window/page 级别上得到定义。资源在哪个词典中得到定义当即限制了该资源的作用域。因此作用域(即您可以在哪里使用资源)取决于您在何处对其进行定义。

  1. 在网格的资源词典中定义资源,则该网格及其子元素才可以访问它。

  2. 在某个窗口/页面上对其进行定义,则该窗口/页面上的所有元素都可以访问它。

  3. 可以在 App.xaml 资源词典中找到应用程序根。它是我们应用程序的根,因此此处定义的资源适用于整个应用程序。

就资源的范围而言,最常见的是应用程序级别、页面级别和特定的元素级别,如 Grid、StackPanel 等。

resource scope

上面的应用程序在其 Window/page 级别中有资源。

Resource Dictionaries

XAML 应用程序中的资源词典意味着资源词典保存在单独的文件中。几乎所有 XAML 应用程序中都遵循此做法。在单独的文件中定义资源可能具有以下优点 -

  1. 在资源词典中定义资源与 UI 相关代码之间分离。

  2. 在单独的文件(如 App.xaml)中定义所有资源,将使它们在整个应用程序中可用。

那么,如何在单独的文件中的资源词典中定义我们的资源?很简单,只需通过 Visual Studio 按照以下给定的步骤添加一个新资源词典 -

  1. 在你的解决方案中,添加一个新文件夹并将其命名为 ResourceDictionaries

  2. 右键单击此文件夹,从“添加”子菜单项中选择“资源词典”,并将其命名为 DictionaryWithBrush.xaml

Example

让我们现在采用相同的示例,但在这里,我们将定义应用程序级别的资源词典。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>

编译并执行上述代码时,将产生以下输出 -

resource dictionaries output

当你单击“更改资源”按钮时,矩形将变为红色。

change resource dictionaries

我们建议你执行上述代码并尝试更多资源(例如,背景颜色)。