2013-04-05 47 views
4

我有一个分配给一个按钮模板:如何检索应用模板的名称(Key)?

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

我如何可以检索与所述按钮此模板的Key/String/Name

伪代码:

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

回答

1

那么恐怕这是不可能的,因为它不是由WPF意。有一些人想要访问与x:Key类似的x:Name,他们都不得不放弃。

请看看这个SO post和这个additional link

我能想到的唯一解决方法是读取ResourceDictionary中的所有模板,实例化每个资源(如果可能),找到模板(如果它是例如样式)并将其与当前在控件中找到的模板实例进行比较。但这似乎是一个相当丑陋的解决方案,我不确定它是否会毫无问题地工作。

+0

感谢您的帮助 – user947737 2013-04-05 20:18:03

2

你不能。至少不会以你想要的方式。

引述this SO post约X:重点(重点煤矿):

x:Key用于正在添加值到 词典,最常见的款式和其他资源正在 项目添加到ResourceDictionary中。 当设置x:Key属性 时,实际上该对象上没有对应的属性,甚至没有设置连接的依赖项属性。它仅由 XAML处理器用于在调用Dictionary.Add时知道使用什么键。

StaticResources加载过程中进行评估,因此控制负载一次,Template属性不再设置为绑定,而是设置为ControlTemplate从你的资源的副本,而对象没有相应的属性被设置为密钥。

您可以通过使用类似XamlWriter.Save之类的东西来查看按钮的XAML字符串来验证该按钮的XAML。

我能想到的唯一解决方案可能会循环使用您的.Resources,并找到等于您的Button的ControlTemplateControlTemplate。我没有测试过,对于大型资源库可能不太实用,但它可能是一个选项。

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

+0

谢谢您清晰简洁的回答 – user947737 2013-04-05 20:17:43