我有一个分配给按钮的模板:
<Button x:Name="btn_PatMat" Template="{StaticResource PatMat_Button}" ...
如何从所述按钮中检索此模板的Key/String/Name
?
伪代码:
String = btn_PatMat.Template.???.ToString()
答案 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读取所有模板,实例化每个资源(如果可能),找到模板(如果它是例如样式)并将其与找到的模板的当前实例进行比较在控制中。但这似乎是一个非常丑陋的解决方案,我不确定它是否能正常运行。