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

时间:2010-06-08 16:30:47

标签: .net wpf

我知道在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 个答案:

答案 0 :(得分:10)

资源可以将任何对象作为键。在代码中添加带有对象键的资源很容易,并且非常有用。在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