C# 设计响应触发器,定义和使用WPF

C# 设计响应触发器,定义和使用WPF,c#,wpf,triggers,C#,Wpf,Triggers,最近我读了一些关于样式和控件模板的文章。正如它所说,控制模板负责整个控制设计。但是,例如,我只想更改默认控件模板的特定部分,例如,当鼠标悬停或控件具有焦点时,当我编写以下内容时: <Style x:Key="StyleTextBox" TargetType="TextBox"> <Setter Property="Margin" Value="5, 0"/> <Setter Property="VerticalCon

最近我读了一些关于样式和控件模板的文章。正如它所说,控制模板负责整个控制设计。但是,例如,我只想更改默认控件模板的特定部分,例如,当鼠标悬停或控件具有焦点时,当我编写以下内容时:

<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视觉样式,而不覆盖整个默认样式呢?

整个模板都被替换了,因为您的XAML说,“将
模板设置为我在这里声明的
控制模板
。”问题是,您的模板是空的。当您想告诉WPF“使用此可视化树表示控件”时,请使用模板。你给了它一个空的视觉树,并且得到了你想要的;)

然而,在这种情况下,您的意图并不是改变控件的视觉结构;您只想更改一个属性。您仍然可以为此使用
触发器
设置器
,但无需创建模板。
样式
有自己的触发器集合,因此您可以将其移动到那里:

<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>

这之所以有效,是因为您只是在更改样式化控件的属性;通常,您可以期望模板遵守应用模板的控件的顶级属性。例如,默认文本框模板应确保使用符合模板化父对象的
background
属性的背景绘制文本框

模板上的触发器在需要操作自定义模板中声明的特定子元素的情况下更有用