4

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

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

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

伪代码:

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

2 回答 2

2

你不能。至少不是你尝试的方式。

引用这篇关于 x:Key 的 SO 帖子(强调我的):

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

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

您可以通过在加载按钮后检查按钮的 XAML 来验证这一点,方法是使用XamlWriter.Save之类的东西来查看它的 XAML 字符串。

我能想到的唯一可行的解​​决方案是遍历您的.Resources,并找到一个ControlTemplate等于您的 Button 的ControlTemplate. 我没有对此进行测试,它对于大型资源库可能不是很实用,但它可能是一种选择。

但是更好的解决方案可能是更改您的逻辑,以便可以通过任何对象需要的其他方式访问键值。

于 2013-04-05T16:12:55.237 回答
1

好吧,恐怕这是不可能的,因为它不是 WPF 的意图。有些人想要访问x:Name类似于x:Key,他们都不得不放弃。

请查看此SO 帖子和此附加链接

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

于 2013-04-05T08:45:40.767 回答