2017-10-11 4 views
3

モードAでスタイルテンプレートを持つボタンがあります。モードAでは、このボタンにはPointerOver VisualStateがあります。モードBにいるときは同じボタンを使用しますが、モードBでは別のPointerOver VisualStateを使いたいと思います。1つの要素に対して2つのスタイルテンプレートを用意し、どの要素をコードの背後で使用するかを決定できますか?

視覚状態を活用してこのようなことを達成するには、どのような方法が最適ですか?私は同じボタンのための2つの異なるスタイルのテンプレートを持っていると思うと、何らかの形でどのスタイルテンプレートを使用するかは分かりませんが、これが可能かどうか、またはこれが最善の方法です。

提案がありますか?

+0

私はそれが簡単だと思います。 – lindexi

+0

テンプレートとスタイルの両方を使用する –

答えて

2

は、背後にあるあなたのコードでこれを試してみてください:それは私が誤解することができますよう

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

また、あなたは、「スタイルテンプレート」スタイルを呼び出すべきではありません。スタイルとテンプレートは2つの異なるものです。

  • テンプレートは、特定のコントロールの構築方法を定義します。例えば、ButtonBorderTextBlock(または他のいくつかのコントロールを使用)を使用して構築されている場合
  • スタイルは、特定のコントロールの外観(テンプレートはそのプロパティの1つ)を記述する一連のプロパティを定義します。
0

別のオプションはButtonがあるべきStyleかを決定するためにConverterを使用することです。

コンバータ:

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に例を掲載して嬉しいです。

関連する問題