"Traditional application resources consist of binary chunks of data, typically representing things such as icons, bitmaps, strings, and XML. In fact, the .NET framework provides
generic support for these through the ResourceManager class.
WPF is no different—binary resources play an important role in a typical application.
However, WPF goes a lot further with another kind of resource: logical resources.
These are objects, any objects, which can be shared and used in a multitude of locations
throughout the application; they can even be accessed across assemblies. Some
of WPF's features, such as implicit (automatic) styles and type-based data templates,
rely on the logical resources system."

传统的资源一般是指大块的二进制资源,典型的如图片、xml文件等,.NET提供了ResourceManager类来管理这些资源。而WPF引进了另一种形式的资源-logical resources(逻辑资源),它可以是任何需要共享的对象。WPF的许多特性也都依赖逻辑资源系统。

These objects are typically placed inside a
ResourceDictionary and located at runtime using a hierarchical search.”

下面通过一个例子,说明为什么需要logical resource、如何在XAML中及Code behind file中访问logical resource。

1.为什么需要Logical Resource?

假如我们需要为一个rectangle的Fill属性赋一个LinearGradientBrush值。通常实现如下:

        <Rectangle Height="100" Stroke="Red">
<Rectangle.Fill>
<LinearGradientBrush >
<GradientStop Offset="0.3" Color="Green"/>
<GradientStop Offset="0.8" Color="Brown"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>

假如,现在我们另外还有1个Rectangle需要同样的Brush,当然我们可以Copy上面的<Rectangle.Fill>...</Rectangle.Fill>,这样可以满足需求,但是这样的Copy很让人头疼。
Logical resource能够解决这个问题。

2.定义logical resource

我们可以把上面的Brush放到Window.Resources中,如下:

    <Window.Resources>
<LinearGradientBrush x:Key="brush1">
<GradientStop Offset="0.3" Color="Green"/>
<GradientStop Offset="0.8" Color="Yellow"/>
</LinearGradientBrush>
</Window.Resources>

注意以下2点:
a.“Every element (deriving from FrameworkElement) has a Resources property of type
ResourceDictionary. This means that every element can have resources associated with
it.”

每个element都有Resources属性。

b.“The Resources property is a dictionary.In XAML, the x:Key attribute must be specified (most of the time; exceptions to this rule
will be discussed in relation to styles and data templates).”

在XAML中x:key必须声明,style和data templates有些例外(x:Type)。

3.在XAML中使用

添加完成后,我们可以在XAML中通过StaticResource(后面介绍DynamicResource)这个markup extension,很方便的使用这个logical resource

<Rectangle Height="100" Fill="{StaticResource brush1}"/>

4.在Code Behind File中使用

如为下面的Ellipse赋Fill值

<Ellipse x:Name="ellipse2" Stroke="Red" StrokeThickness="20" Height="100" />

我们有两种方法获取这个Resource。

方法a:通过FrameworkElement.FindResource ,此方法在找不到的时候放回null,因此最好加个null判断。

Brush brush1 = (Brush)ellipse2.FindResource("brush1");
if (brush1 != null)
{
ellipse2.Fill = brush1;
}

方法b.是资源可以通过它的索引直接获得。由于我们知道定义资源的是哪个element,我们可以直接使用element.Resources["name"]获得。本例定义的是Window的资源,因此是:

Brush brush = (Brush)this.Resources["brush1"];

5.Logical Resource是如何匹配的?

如上面的

<Rectangle Height="100" Fill="{StaticResource brush1}"/>

This causes a search from the current element (the Rectangle) up the element tree, looking
for a resource with the key brush1; if found, its associated object is used as the property's
value. If not found on any element up to the root Window, the search continues within the
resources of Application (typically located in the App.xaml file). If not found even there,
a runtime exception is thrown. This is depicted in the following diagram:”

附:完整的XAML和Code Behind File如下:

<Window x:Class="UsingLogicalResources.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<LinearGradientBrush x:Key="brush1">
<GradientStop Offset="0.3" Color="Green"/>
<GradientStop Offset="0.8" Color="Yellow"/>
</LinearGradientBrush>
</Window.Resources>
<StackPanel>
<Rectangle Height="100" Stroke="Red">
<Rectangle.Fill>
<LinearGradientBrush >
<GradientStop Offset="0.3" Color="Green"/>
<GradientStop Offset="0.8" Color="Brown"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Ellipse x:Name="ellipse2" Stroke="Red" StrokeThickness="20" Height="100" />
<Rectangle Height="100" Fill="{StaticResource brush1}"/>
</StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes; namespace UsingLogicalResources
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); //Brush brush1=(Brush)this.Resources["brush1"];
Brush brush1 = (Brush)ellipse2.FindResource("brush1");
if (brush1 != null)
{
ellipse2.Fill = brush1;
}
}
}
}

运行,如下:

WPF整理-使用逻辑资源的更多相关文章

  1. WPF整理-二进制资源和内容

    WPF中的Binary Resource(二进制资源)是相对于前面所说的Logical resource(逻辑资源)而说的,一般指Image.XML文件等. 注意:这里说的是Resource" ...

  2. WPF教程九:理解WPF中的对象资源

    在WPF中,所有继承自FrameworkElement的元素都包含一个Resources属性,这个属性就是我们这篇要讲的资源. 这一篇讲解的资源是不是上一篇的程序集资源(那个是在编译过程中打包到程序集 ...

  3. WPF整理-Style

    "Consistency in a user interface is an important trait; there are many facets of consistency,   ...

  4. WPF整理-XAML构建后台类对象

    1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的.其实不然! "Actually, XAML has nothing to do with UI. It's mer ...

  5. 【转载】国外程序员整理的Java资源大全

    以下转载自: 推荐!国外程序员整理的Java资源大全中文版    https://github.com/akullpp/awesome-java英文版 Java 几乎是许多程序员们的入门语言,并且也是 ...

  6. WPF之神奇的资源

    原文:WPF之神奇的资源 WPF中的资源有两种,一种称为"程序集资源"(assembly resource),另一种称为"对象资源"(object resour ...

  7. WPF整理-使用用户选择主题的颜色和字体

    “Sometimes it's useful to use one of the selected colors or fonts the user has chosen in theWindows ...

  8. WPF整理-自定义一个扩展标记(custom markup extension)

    "Markup extensions are used to extend the capabilities of XAML, by providing declarativeoperati ...

  9. WPF整理-XAML访问静态属性

    "XAML provides an easy way to set values of properties—type converters and the extended propert ...

随机推荐

  1. dos 操作显示 > nul 2>nul

    1>nul 屏蔽操作成功显示的信息,但是出错还是会显示(同 >nul)2>nul 屏蔽操作失败显示的信息,但是成功还是会显示>nul 2>nul 就是正确的错误的一起屏蔽 ...

  2. linux git安装及配置(包括更新)

    1.在终端运行命令 sudo apt-get install git 2.查看版本号 git --version  (若不是最新可更新 自选) 更新提示: sudo add-apt-repositor ...

  3. IDA插件栈字符串识别插件

    该插件是一款可以自动识别栈上局部变量为字符串的插件,字符串形式如下,并自动的加上注释                                       如图:可以自动识别栈上的字符串 项目主 ...

  4. java12

    1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数组,查询快,增删慢 线程安全,效率低 ...

  5. server2003中看不到网上邻居内容,其他电脑无法通过计算机名和IP访问本计算机(但网上邻居中可访问到)

    现象1:server2003中看不到网上邻居内容,查看工作组计算机看到的是空列表, 现象2:其他电脑无法通过计算机名和IP访问本计算机(但网上邻居中可访问到)   访问提示:--Windows 200 ...

  6. nfs部署和优化

    nfs--网络文件系统 1.说明:允许一个系统在网络上与他人共享目录和文件 2.好处:通过nfs服务,就可以让这个机器访问远程的文件,像访问自己的文件一样,属于cs通信   3.原理说明:假设有A,B ...

  7. yii框架中验证器声明一组内置验证器可以使用短名称引用

    1.内置验证器的短名称分别有: boolean: yii\validators\BooleanValidator captcha: yii\captcha\CaptchaValidator compa ...

  8. 获取到Android控件的高度

    问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单 ...

  9. Tensorflow二分类处理dense或者sparse(文本分类)的输入数据

    这里做了一些小的修改,感谢谷歌rd的帮助,使得能够统一处理dense的数据,或者类似文本分类这样sparse的输入数据.后续会做进一步学习优化,比如如何多线程处理. 具体如何处理sparse 主要是使 ...

  10. 关于ActiveMQ的几种集群配置

    ActiveMQ的几种集群配置. Queue consumer clusters 此集群让多个消费者同时消费一个队列,若某个消费者出问题无法消费信息,则未消费掉的消息将被发给其他正常的消费者,结构图如 ...