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

Xaml 是否可以为一个元素使用两个样式模板,并决定在代码隐藏中使用哪一个?,xaml,uwp,styles,uwp-xaml,visualstates,Xaml,Uwp,Styles,Uwp Xaml,Visualstates,我有一个按钮,在模式a中有一个样式模板。在模式a中,这个按钮有一个指针在VisualState上。我在模式B中使用相同的按钮,但在模式B中,我希望在VisualState上使用不同的指针 利用视觉状态完成类似任务的最佳方法是什么?我正在考虑为同一个按钮使用两个不同的样式模板,并以某种方式更改在代码隐藏中使用的样式模板,但不确定这是否可行,或者这是否是实现这一点的最佳方法 有什么建议吗?在您的代码隐藏中尝试一下: [control name].Style = this.FindResource("

我有一个按钮,在模式a中有一个样式模板。在模式a中,这个按钮有一个指针在VisualState上。我在模式B中使用相同的按钮,但在模式B中,我希望在VisualState上使用不同的指针

利用视觉状态完成类似任务的最佳方法是什么?我正在考虑为同一个按钮使用两个不同的样式模板,并以某种方式更改在代码隐藏中使用的样式模板,但不确定这是否可行,或者这是否是实现这一点的最佳方法


有什么建议吗?

在您的代码隐藏中尝试一下:

[control name].Style = this.FindResource("[style key]") as 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上的属性,从理论上讲,这将允许您修改按钮在运行时的“模式”,具体取决于数据。如果您需要更多的代码,我很乐意在Github上发布一个示例。

我认为这很容易做到。同时使用模板和样式