为什么FrameworkElement的FindResource()方法接受一个对象而不是一个字符串?

3
我知道在FrameworkElement(例如Window)上调用FindResource()可以用来查找FrameworkElement的ResourceDictionary中的资源。
例如,我经常使用它通过代码访问Style以动态地向Style添加新的Setter。我总是将Style的x:Key值作为字符串传递给FindResource()方法。像这样... Style style = w.FindResource("GridDescriptionColumn") as Style; 我的问题是,我注意到FindResource()接受类型为object的参数,而不是类型为string的参数。我无法想象我会以不是字符串的参数调用FindResource()的原因。这让我想到我可能不知道其他使用FindResource()的方法。
有人知道为什么FindResource()接受对象而不是字符串类型的参数吗?如果知道,请举一个使用非字符串类型参数调用FindResource()的例子?
谢谢。
1个回答

11

一个资源可以有任何对象作为键。在代码后台添加具有对象键的资源很容易,也可能会很有用。在XAML中,大多数情况下您使用字符串作为x:Key。但是有一种常见情况,其中键不是字符串,甚至可能在不知不觉中使用:

当一个Style没有x:Key时,它将应用于其TargetType的每个实例。但编译器会添加一个隐式键:即TargetType本身的类型。

简而言之,在资源部分编写<Style TargetType="{x:Type Button}" />与编写<Style TargetType="{x:Type Button}" x:Key="{x:Type Button}" />完全相同。要从代码中获取此资源,请使用FindResource(typeof(Button)),传递一个Type而不是一个string


1
FindResource(typeof(Button)) did not work for me when working on a TreeView with DataTemplates in the TreeView.Resources, I had to wrap the type object in a key class - element.FindResource(new DataTemplateKey(typeof(MyClass))) - bakerhillpins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接