4

私は次のものを持っていますStyle

<Style x:Key="ButtonBase" TargetType="Button">
        <Setter Property="Background" Value="#FF007BFF"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="Template">
            <Setter.Value>
                 <ControlTemplate TargetType="Button">
                      <ControlTemplate.Triggers>
                           <Trigger Property="IsPressed" Value=">
                                <Setter Property="Background" Value="Yellow" />
                                <Setter Property="Foreground" Value="Black" />
                           </Trigger>
                           <Trigger Property="IsPressed" Value="False">
                                <Setter Property="Background" Value="#FF007BFF" />
                                <Setter Property="Foreground" Value="White" />
                           </Trigger>
                      </ControlTemplate.Triggers>
                 </ControlTemplate>
             <Setter.Value>
        </Setter>
</Style>

および継承されたStyle:

<Style x:Key="ElementButton" TargetType="Button" BasedOn="{StaticResource ButtonBase}">
        <Setter Property="Margin" Value="10"/>
        <Setter Property="Height" Value="200"/>
</Style>

私がやりたいのは、基本スタイルに任意の変数を設定できるようにすることです:

<Setter Variable="HoverColor" Value="Pink"/>

次に、トリガーを次のように使用できます。

<Trigger Property="IsPressed" Value=">
    <Setter Property="Background" Value="{TemplateBinding HoverColor}" />
    <Setter Property="Foreground" Value="Black" />
</Trigger>

最後に、継承したスタイルでそれをオーバーライドできます。

<Style x:Key="ElementButton" TargetType="Button" BasedOn="{StaticResource ButtonBase}">
    <Setter Property="Margin" Value="10"/>
    <Setter Property="Height" Value="200"/>
    <Setter Variable="HoverColor" Value="Red"/>
</Style>

これを達成する方法はありますか?私はすでに静的リソースを見てきましたが、これらはオーバーライドできません。また、コード ビハインドがないため、コード ビハインドが必要なものは使用できません。

4

1 に答える 1

2

それは良い質問であり、私もこの種のことと戦ってきました。XAML のみのアプローチでうまくいく可能性があるかもしれませんが、もしあるとしたら、かなりぎこちなく感じると思います。あなたが望むものをどのように達成するかについて、いくつかの提案があります。

まず、簡単な観察。あなたは「コード ビハインドがない」と言い、ビューは「XAML のみ」であると言います。まあ、少なくともコードビハインドファイルを持たない UserControl View を見たことがないので、そこにコードを入れたくないだけだと思っていると思います (必須の 以外)。そうは言っても、これから概説するアプローチでは、コード ビハインド ファイルにコードは必要ありません。InitializeComponent()

結局のところ、あなたが本当に望んでいるのは、いくつかのカスタム「変数」を定義することのように思えます。これらの提案はまさにそれを行いますが、最初に想定した方法ではないかもしれません.

問題を解決する最初のアプローチは、スタイリングに関心のあるコントロールをサブクラス、それにカスタム依存関係プロパティを追加することです。たとえば、 をサブクラス化Buttonして、 のように言うことができますButtonWithMyVariables。これらのカスタム依存関係プロパティの 1 つは、タイプの「HoverColor」Color、またはより適切には、タイプの「HoverBrush」と呼ばれます。Brush(背景または前景のプロパティに直接適用したい場合)。次に、基本 Style で HoverColor を任意の値に設定し、継承した Style でそれをオーバーライドするか、XAML の要素で直接オーバーライドすることができます。このアプローチのコード サンプルは提供していません (現時点では、要求がない限り)。

2 番目のアプローチは、カスタム添付プロパティを定義することです。スタイリングの問題に厳密に対処するためにこのアプローチが使用されているのを見たことがありません。おそらく、この場合、添付された「動作」が完全に機能するために、作成者はスタイルファイルを使用して反応 (バインド) し、ベースの視覚的な変更を適用したためです。添付プロパティのコードではなく、スタイル的に何かを行うコールバックを変更しました(しかし、それはまだそのように行うことができると思います)。ただし、既存のコントロールをサブクラス化する必要がないため、このアプローチは多くの人にとって「軽量」に感じられます。

この 2 番目のアプローチの例は、MahApps.Metro ライブラリ、特にTextboxHelper クラス(添付プロパティを格納する) とControls.TextBox.xaml スタイル ファイル(これらの添付プロパティにバインドする) で見つけることができます。たとえば、TextBox のコントロール テンプレートには、Watermark 添付プロパティを使用する次の行があります。

<TextBlock x:Name="Message" 
           Text="{TemplateBinding Controls:TextboxHelper.Watermark}" Visibility="Collapsed"
                                   Foreground="{TemplateBinding Foreground}" IsHitTestVisible="False" Opacity="0.6" HorizontalAlignment="Left" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                   Margin="6,0,0,0"/>

ここで、基本スタイルの透かし値を何かに設定できると想像できます。

<Setter Property="Controls:TextboxHelper.Watermark" 
        Value="My helpful watermark for all!"/>

そして、継承されたスタイルでそれをオーバーライドします:

<Setter Property="Controls:TextboxHelper.Watermark" 
        Value="A more specific watermark!"/>

どちらのアプローチでも、必要な「変数」を定義し、スタイル セッターで簡単に設定したり、継承されたスタイルでオーバーライドしたり、TemplateBindコントロール テンプレート内で、またはTriggerそれらから離れたりすることができます。

于 2013-02-06T14:51:56.647 に答える