是否可以为一个元素使用两个样式模板,并决定在代码隐藏中使用哪个样式模板



我有一个按钮,在模式 A 中有一个样式模板。在模式 A 中,此按钮具有指针在视觉对象状态上。当我处于模式 B 时,我使用相同的按钮,但在模式 B 中,我希望有一个不同的 PointerOver VisualState。

利用视觉状态完成这样的事情的最佳方法是什么?我正在考虑为同一个按钮使用两个不同的样式模板,并以某种方式更改要在代码隐藏中使用的样式模板,但不确定这是否可能,或者这是否是解决此问题的最佳方法。

有什么建议吗?

在你的代码后面试试这个:

[control name].Style = this.FindResource("[style key]") as Style;

此外,您不应该将样式称为"样式模板",因为它可能会被误解。样式和模板是两个不同的东西。

  • 模板定义如何生成给定控件。例如,如果使用BorderTextBlock(或使用其他一些控件)构建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 上发布一个示例。

相关内容

  • 没有找到相关文章

最新更新