0

最近、スタイルとコントロール テンプレートについて読みました。それが言うように、コントロール テンプレートはコントロール デザイン全体を担当します。しかし、たとえば、これを書いたときに、マウスが上にあるとき、またはコントロールにフォーカスがあるときなど、デフォルトのコントロールテンプレートの特定の部分のみを変更したい:

<Style x:Key="StyleTextBox"  TargetType="TextBox">
            <Setter Property="Margin" Value="5, 0"/>
            <Setter Property="VerticalContentAlignment" Value="Center"/>
            <Setter Property="HorizontalContentAlignment" Value="Left"/>
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="SelectionBrush" Value="#CCFBE6D9"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="BorderBrush" Value="Black" />
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
</Style>

..テンプレート全体がオーバーライドされました...そして、ちょっとクールではありません...

では、デフォルト スタイル全体をオーバーライドせずに、isMouseOver ビジュアル スタイルのみを変更するにはどうすればよいでしょうか。

4

1 に答える 1

2

XAML が「ここで宣言しているものTemplateこれに設定してください」と言っているため、テンプレート全体が置き換えられました。 ControlTemplate問題は、テンプレートが空であることです。WPF に「このビジュアル ツリーを使用してコントロールを表現する」ように伝えたい場合は、テンプレートを使用します。あなたはそれに空のビジュアルツリーを与え、あなたが求めていたものを正確に手に入れました;)。

ただし、この場合、目的はコントロールの視覚的な構造を変更することではありません。プロパティを変更したいだけです。これには引き続きTriggerandSetterを使用できますが、そのためにテンプレートを作成する必要はありません。AStyleにはトリガーの独自のコレクションがあるため、そこに移動するだけです。

<Style x:Key="StyleTextBox"  TargetType="TextBox">
  <Setter Property="Margin" Value="5, 0"/>
  <Setter Property="VerticalContentAlignment" Value="Center"/>
  <Setter Property="HorizontalContentAlignment" Value="Left"/>
  <Setter Property="BorderBrush" Value="Black"/>
  <Setter Property="Background" Value="Transparent"/>
  <Setter Property="SelectionBrush" Value="#CCFBE6D9"/>
  <Style.Triggers>
    <Trigger Property="IsMouseOver" Value="True">
      <Setter Property="BorderBrush" Value="Black" />
    </Trigger>
  </Style.Triggers>
</Style>

スタイル付きコントロールのプロパティを変更しているだけなので、これは機能します。一般に、テンプレートは、テンプレートが適用されるコントロールの最上位のプロパティを尊重することが期待できます。たとえば、デフォルトの TextBox テンプレートでは、テンプレート化された親のBackgroundプロパティに準拠した背景で TextBox が描画されるようにする必要があります。

テンプレートのトリガーは、カスタム テンプレート内で宣言された特定のサブ要素を操作する場合により便利です。

于 2013-10-25T16:37:04.170 に答える