2017-10-11 44 views
3

我有一个按钮,在模式A中有一个样式模板。在模式A中,此按钮具有一个PointerOver VisualState。当我处于模式B时,我使用相同的按钮,但在模式B中,我想要使用不同的PointerOver VisualState。是否有可能为一个元素有两个样式模板并决定在代码后面使用哪一个?

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

有什么建议吗?

+0

我认为这很容易做到。 – lindexi

+0

使用模板和样式 –

回答

2

在后面的代码试试这个:

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

而且你不应该叫样式“样式模板”,因为它可以我误解了。样式和模板是两个不同的东西。

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

另一种选择是使用Converter来决定哪些StyleButton应该的。

转换器:

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}}" /> 

我用Binding在我的视图模型,一个属性,它在理论上将允许你修改的“模式”按钮在运行时取决于数据。如果你需要更多的代码,我很乐意在Github上发布一个例子。

相关问题