我在Window.Resources上有几个样式,我用C#应用于几个按钮。然后我需要改变样式,但首先我需要知道应用于我想要改变样式的按钮的当前样式是什么。我找不到从按钮获取样式名称的方法!
你尝试过Button.Style
财产吗?如果使用资源Key
完成样式的explcit设置,那么你应该使用Button.Style
propetry获取按钮的当前样式,否则在控制级别收集所有Style
相关信息有点棘手。
这是有原因的。样式是继承的,可以在不同的元素范围覆盖,例如App,Window,UserControl,Ancestor UIElements,最后是单独的控件。因此,当您访问Button.Style
属性时,您将获得一种样式,这是应用于Button
的最后一种直接样式。如果风格是BasedOn
另一个Style
然后Style.BasedOn
将给你父母/基地Style
。再次,如果BasedOn
风格来自另一个Style
,我们将得到Style.basedOn.BasedOn
...等。
我希望这是有道理的。 :-)
如果您以这种方式解决问题,我认为您在设计/架构方面犯了一个错误。如果需要有条件地更改样式,可以使用data-binding和templating基于保存相关信息的对象创建UI元素。
这是一个很好的问题(+1)。
这只是我的想法,可能不是很准确。我怀疑获得UI控件的样式是否有意义。假设您将样式“style1”应用于UI控件,然后您可以设置单个属性,如前景/背景......现在,样式是什么?
如果你想维护/跟踪按钮的状态,那么应该以可视状态或后面的代码(ViewModel / Model)来处理。
见:Style
public void FooFunc()
{
Button myButton = ...;
Console.WriteLine("The Style: {0}", myButton.Style);
}
我想那就是你要找的东西?
感谢您的回答,我正在使用另一个stackoverflow中的此函数..它的工作原理并将样式名称返回到字符串中!
static public string FindNameFromResource(ResourceDictionary dictionary, object resourceItem)
static public string FindNameFromResource(ResourceDictionary dictionary, object resourceItem)
{
foreach (object key in dictionary.Keys)
{
if (dictionary[key] == resourceItem)
{
return key.ToString();
}
}
return null;
}
@Max,我是WPF的新手,不得不在我可以拥有的两种已知样式中的一种之间切换我的Border对象的样式。而不是在FindNameFromResource中使用线性搜索,而是改为做...
Style normal = (Style)this.Resources["NormalBorder"];
Style strong = (Style)this.Resources["StrongBorder"];
border.Style = border.Style == normal ? strong : normal;