【发布时间】:2010-09-03 16:38:14
【问题描述】:
我只是好奇为什么当我通过x:Name 访问大多数控件时,对于资源我使用x:Key + 我无法从代码访问它(可以使用this.Resources["keyName"])
【问题讨论】:
标签: wpf
我只是好奇为什么当我通过x:Name 访问大多数控件时,对于资源我使用x:Key + 我无法从代码访问它(可以使用this.Resources["keyName"])
【问题讨论】:
标签: wpf
•x:Key:为 ResourceDictionary(或其他框架中的类似字典概念)中的每个资源设置唯一键。 x:Key 可能占典型 WPF 应用程序标记中 x: 用法的 90%。
•x:Name:为在处理对象元素后存在于运行时代码中的实例指定运行时对象名称。通常,您会经常为 x:Name 使用 WPF 定义的等效属性。此类属性专门映射到 CLR 支持属性,因此更便于应用程序编程,您经常使用运行时代码从初始化的 XAML 中查找命名元素。最常见的此类属性是 FrameworkElement.Name。当特定类型不支持等效的 WPF 框架级 Name 属性时,您仍可以使用 x:Name。这发生在某些动画场景中。
因此,您必须为资源使用密钥
【讨论】:
您可以访问任何FrameworkElement 上的资源只要该元素包含任何资源。如果在您的标记中定义,则它必须有 x:Key 并且不能有 x:Name。
例如,如果 Button 包含资源,则必须从其 Resources 集合中访问它。
var resource = button.Resources["myKey"];
如果您想从对象、其父对象或应用程序中查找资源,请改用FindResource()。
var resource = this.FindResource("myKey");
我不明白你的困惑。
【讨论】:
x:Key 用于您定义的任何资源。 x:Name 用于您希望在代码中直接访问的任何元素(不是资源)。