如何检索应用模板的名称(Key)?

时间:2013-04-05 08:08:51

标签: c# wpf

我有一个分配给按钮的模板:

<Button x:Name="btn_PatMat" Template="{StaticResource PatMat_Button}" ...

如何从所述按钮中检索此模板的Key/String/Name

伪代码:

String = btn_PatMat.Template.???.ToString()

2 个答案:

答案 0 :(得分:2)

你做不到。至少不是你想要的方式。

引用this SO post关于x:Key(强调我的):

  

x:Key用于作为值添加到的项目   字典,通常用于样式和其他资源   添加到ResourceDictionary。 设置x:Key属性时,   实际上对象上甚至没有相应的属性   附加的依赖属性被设置。它只是被使用   XAML处理器在调用Dictionary.Add时知道要使用哪个键。

在加载过程中会对

StaticResources进行评估,因此一旦控件加载,Template属性就不再设置为绑定,而是设置为ControlTemplate的副本。资源,并且该对象上没有相应的属性设置为密钥。

您可以通过使用XamlWriter.Save之类的内容查看按钮的XAML来查看它的XAML字符串来验证这一点。

我能想到的唯一可行方法是循环使用.Resources,找到一个等于你的按钮ControlTemplate的{​​{1}}。我没有对此进行过测试,对于大型资源库来说可能不太实用,但它可能是一种选择。

但更好的解决方案可能是改变你的逻辑,这样就可以通过任何对象需要的方式来访问键值。

答案 1 :(得分:1)

嗯,我担心这是不可能的,因为WPF并不打算这样做。有些人想要访问类似于x:Name的{​​{1}},他们都不得不放弃。

请查看此SO post和此additional link

我能想到的唯一解决方法是从ResourceDictionary读取所有模板,实例化每个资源(如果可能),找到模板(如果它是例如样式)并将其与找到的模板的当前实例进行比较在控制中。但这似乎是一个非常丑陋的解决方案,我不确定它是否能正常运行。