我有一个按钮,在模式 A 中有一个样式模板。在模式 A 中,此按钮具有指针在视觉对象状态上。当我处于模式 B 时,我使用相同的按钮,但在模式 B 中,我希望有一个不同的 PointerOver VisualState。
利用视觉状态完成这样的事情的最佳方法是什么?我正在考虑为同一个按钮使用两个不同的样式模板,并以某种方式更改要在代码隐藏中使用的样式模板,但不确定这是否可能,或者这是否是解决此问题的最佳方法。
有什么建议吗?
在你的代码后面试试这个:
[control name].Style = this.FindResource("[style key]") as Style;
此外,您不应该将样式称为"样式模板",因为它可能会被误解。样式和模板是两个不同的东西。
- 模板定义如何生成给定控件。例如,如果使用
Border
和TextBlock
(或使用其他一些控件)构建Button
。 - 样式定义一组属性,描述给定控件的外观(模板是该属性之一)。
另一种选择是使用Converter
来决定Button
应该是哪个Style
。
转炉:
public class ButtonStyleConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, string language)
{
var mode = (int)value;
return mode == 1 ? Application.Current.Resources["ButtonStyle1"] as Style : Application.Current.Resources["ButtonStyle2"] as Style;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
//Do nothing
}
}
用法:
<Button Content="Hello" Style="{Binding Button1Mode, Converter={StaticResource ButtonStyleConverter}}"/>
<Button Content="World" Style="{Binding Button2Mode, Converter={StaticResource ButtonStyleConverter}}" />
我对 ViewModel 上的属性使用了Binding
,理论上,它允许您根据数据修改按钮在运行时的"模式"。如果您需要更多代码,我很乐意在 Github 上发布一个示例。