x:Shared 属性
设置为 false
时,修改 WPF 资源检索行为,以便属性化资源的请求为每个请求创建新实例,而不是为所有请求共享同一实例。
XAML 属性用法
<ResourceDictionary>
<object x:Shared="false".../>
</ResourceDictionary>
言论
x:Shared
映射到 XAML 语言 XAML 命名空间,并由 .NET XAML 服务及其 XAML 读取器识别为有效的 XAML 语言元素。 但是,x:Shared
的声明功能仅适用于 WPF 应用程序和 WPF XAML 分析器。 在 WPF 中,仅当 x:Shared
应用于 WPF ResourceDictionary中存在的对象时,x:Shared
才有用。 其他用法不会引发分析异常或其他错误,但它们不起作用。
XAML 语言规范中未指定 x:Shared
的含义。 其他 XAML 实现(如在 .NET XAML 服务上生成的实现)不一定提供资源共享支持。 此类 XAML 实现可以在支持框架中提供类似的行为,该框架也使用了 x:Shared
值。
在 WPF 中,资源的默认 x:Shared
条件是 true
。 此条件意味着任何给定的资源请求始终返回相同的实例。
修改通过资源 API 返回的对象(如 FindResource)或修改 ResourceDictionary中的对象会更改原始资源。 如果对该资源的引用是动态资源引用,该资源的使用者将获取更改的资源。
如果对资源的引用是静态资源引用,则 XAML 处理时间后对资源的更改无关。 有关静态与动态资源引用的详细信息,请参阅 XAML 资源概述(WPF .NET)。
显式指定 x:Shared="true"
很少完成,因为这是默认值。 WPF 对象模型中的 x:Shared
没有等效的直接代码;它只能在 XAML 用法中指定,并且必须使用默认 WPF 行为或在加载路径上的中间 XAML 节点流中处理(如果使用 .NET XAML 服务及其 XAML 读取器进行处理)。
x:Shared="false"
的一种方案是将 FrameworkElement 或 FrameworkContentElement 派生类定义为资源,然后将元素资源引入内容模型。
x:Shared="false"
允许在同一集合中多次引入元素资源(例如 UIElementCollection)。 如果没有 x:Shared="false"
则无效,因为集合强制实施其内容的唯一性。 但是,x:Shared="false"
行为会创建资源的另一个相同实例,而不是返回同一实例。
x:Shared="false"
的另一种方案是,如果对动画值使用 Freezable 资源,但希望根据动画修改资源。
false
的字符串处理不区分大小写。
在 WPF 中,x:Shared
仅在以下条件下有效:
必须编译包含具有
x:Shared
项的 ResourceDictionary。 ResourceDictionary 不能位于松散的 XAML 中,也不能用于主题。包含项的 ResourceDictionary 不得嵌套在另一个 ResourceDictionary中。 例如,不能对 ResourceDictionary 中已是 ResourceDictionary 项的 Style 中的项使用
x:Shared
。