是否可以为一个元素设置两个样式模板,并决定在后面的代码中使用哪个?

时间:2017-10-11 02:21:11

标签: xaml uwp styles uwp-xaml visualstates

我有一个在模式A中有样式模板的按钮。在模式A中,此按钮具有PointerOver VisualState。我在模式B时使用相同的按钮,但在模式B中我想要一个不同的PointerOver VisualState。

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

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

在您的代码中尝试此操作:

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

此外,您不应该调用样式“样式模板”,因为我可能会误解。样式和模板是两回事。

  • 模板定义如何构建给定控件。例如,如果使用ButtonBorder构建TextBlock(或使用其他一些控件)。
  • 样式定义一组属性,描述给定控件的外观(模板是其中一个属性)。

答案 1 :(得分:1)

另一个选择是使用Converter来确定Style应该是Button

转换器:

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属性,理论上它允许你修改&#34;模式&#34;该按钮在运行时取决于数据。如果您需要更多代码,我很乐意在Github上发布一个示例。