6

デフォルトの wpf コンボボックスの PART_EditableTextBox を変更したいと思います (たとえば、背景を変更します)。

私はこのようなスタイルを追加しようとしました:

<Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}">
  <Setter Property="Control.Template">
    <Setter.Value>
      <ControlTemplate TargetType="ComboBox">
        <TextBox x:Name="PART_EditableTextBox" Background="AntiqueWhite"/>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

ただし、これにより、デフォルト テンプレートの残りの部分が無視されます。

PART_EditableTextBox の特定のプロパティをオーバーライドする方法はありますか、それともコントロール テンプレート全体をコピーしてそこに変更を加える必要がありますか?

4

2 に答える 2

7

コントロールの外観を変更するいくつかの異なる方法...

コントロール テンプレートのコピー、編集、およびスタイルでの使用

コントロールのテンプレートをコピーして変更する場合、1 つのことに注意する必要があります...テーマ。

コントロールは、テーマ (つまり、異なるクロム) に応じて完全に異なるテンプレート デザインを持つ可能性があります...したがって、問題は...どのテンプレートをコピーして変更し、コントロールで使用するかです。

どちらを選択しても...問題があります...テンプレートをコピーしたテーマとは異なるテーマで誰かがWindowsを実行している場合...まあ、そのコントロールは間違っている/外に見えます場所。

さまざまなテンプレートがさまざまなテーマでどのように見えるかを確認するには... ShowMeTheTemplate を使用します。

したがって、適切に行うには、各テーマ (Classic、Luna、Aero、Royale など) のテンプレートをコピーして変更し、必要な手順を実行して、テーマが変更されたときに別のテーマのテンプレートが読み込まれるようにする必要があります...コントロールが「テーマに対応」するようにします。


実行時にテンプレートが適用された後のビジュアル ツリーの変更

コントロールの作成者である場合、またはコントロールの派生バージョンを作成する場合は、テンプレートが適用されるまで待ってからOnApplyTemplate、ビジュアル ツリーで「パーツ」を探すことができます。次に、実行時にビジュアル ツリー/変更属性を変更します (つまり、PART_EditableTextBox の背景を変更できます)。

ただし、暗黙的なスタイルに依存している場合 (そのまま)、またはすべてのコントロールを XAML の派生バージョンに置き換えたくない、または置き換えることができない場合、これは機能しません。


実行時に ControlTemplate のコピーを取得し、「パーツ」を変更する

別の可能性があります....実行時にコントロールの ControlTemplate を取得する...(これは、その時点で設定されている現在のテーマ用です)....それを変更してから、コントロールに設定します。

これの利点は、システムに新しいテーマがあり、それらの名前を事前に知らなかった場合 (したがって、テンプレートを設計しなかった場合)、コントロール テンプレートがジェネリック テーマから選択されるのではなく、 (したがって、場違いです)...新しいテーマにより適した外観になる可能性が高くなります. しかし、それはちょっとしたハックです。

于 2012-08-17T23:40:05.653 に答える
3

「BasedOn」を使用すると、新しいスタイルで指定したプロパティのみが上書きされます。

ただし、あなたの場合、上書きするプロパティはテンプレートです。これは、スタイルで変更しようとしているプロパティであるため、コンボボックスのテンプレート全体です。

その一部だけを上書きするには、コントロール テンプレート全体をコピーして、そこに変更を加える必要があります。あなたが思ったように。

コントロール テンプレート全体を取得する Expression Blend がない場合は、MSDNで見つけることができます。

于 2012-08-17T19:13:54.257 に答える