XAML - 资源

资源通常是与某些对象相关联的定义,您希望这些对象使用的频率高于一次.它能够在本地为控件或当前窗口存储数据,或者为整个应用程序全局存储数据.

将对象定义为资源允许我们从其他位置访问它.因此,它允许可重用性.资源在资源字典中定义,任何对象都可以定义为有效的资源,使其成为可共享的资产.为XAML资源指定了一个唯一键,使用该键可以使用StaticResource标记扩展来引用它.

让我们再看一个简单的例子,其中两个文本块是使用一些属性创建,其前景色在 Window.Resources 中定义.

<Window x:Class = "XAMLResources.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   Title = "MainWindow" Height = "350" Width = "604"> 
	
   <Window.Resources> 
      <SolidColorBrush Color = "Blue" x:Key = "myBrush"></SolidColorBrush> 
   </Window.Resources>  
	
   <StackPanel Orientation = "Vertical"> 
      <TextBlock Foreground = "{StaticResource myBrush}" 
         Text = "First Name" Width = "100" Margin = "10" /> 
      <TextBlock Foreground = "{StaticResource myBrush}" 
         Text = "Last Name" Width = "100" Margin = "10" /> 
   </StackPanel> 
	
</Window>

编译并执行上述代码时,它将生成以下MainWindow.您可以看到两个带蓝色前景色的文本块.资源的优点是,如果有多个文本块并且您想要更改其背景颜色,那么您只需要在资源字典中更改它.

Resources

资源范围

资源在资源字典中定义,但有很多地方可以定义资源字典.在上面的示例中,资源字典在Window/page级别定义.在什么字典中定义资源会立即限制该资源的范围.所以范围,即你可以使用资源的位置,取决于你定义它的位置.

  • 定义资源在网格的资源字典中,它只能由该网格及其子元素访问.

  • 在窗口/页面上定义它并且所有人都可以访问它该窗口/页面上的元素.

  • 可以在App.xaml资源字典中找到App根目录.它是我们应用程序的根,因此这里定义的资源范围限定为完整的应用程序.

至于资源的范围关注的是,最常见的是应用程序级别,页面级别和特定元素级别,如Grid,StackPanel等.

资源范围

资源字典

XAML应用程序中的资源字典意味着资源字典在单独的文件中.几乎所有XAML应用程序都遵循它.在单独的文件中定义资源可以具有以下优点 :

  • 在资源字典中定义资源与UI相关代码之间的分离.

  • 在App.xaml等单独文件中定义所有资源会使其在整个应用程序中可用.

那么,我们如何在单独的文件中定义资源字典中的资源?嗯,这很容易,只需通过以下步骤通过Visual Studio添加一个新的资源字典 :

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

  • 右键单击此文件夹,然后从添加子菜单项中选择资源字典并将其命名为 DictionaryWithBrush.xaml

让我们来看看同一个应用程序;现在只在资源字典中定义了资源字典.

这是MainWindow.xaml的XAML代码.

<Window x:Class = "XAMLResources.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" 
   Title = "MainWindow" Height = "350" Width = "604"> 
	
   <StackPanel Orientation = "Vertical"> 
      <TextBlock Foreground = "{StaticResource myBrush}" Text = "First Name" 
         Width = "100" Margin = "10" /> 
      <TextBlock Foreground = "{StaticResource myBrush}" Text = "Last Name" 
         Width = "100" Margin = "10"/> 
   </StackPanel> 
	
</Window>

这是DictionaryWithBrush.xaml中的实现 :

<ResourceDictionary 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"> 
	
   <SolidColorBrush Color = "Blue" x:Key = "myBrush"></SolidColorBrush> 
	
</ResourceDictionary>

以下是app.xaml中的实现 :

<Application x:Class = "XAMLResources.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>

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

Resources

我们建议你执行上面的代码并尝试一些更多的资源,比如背景颜色等.