我知道在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()的示例是什么?
感谢。
答案 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
。