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“使用可视化树表示控件”时,请使用模板。你给了它一个空的可视化树,得到了你想要的;)。

然而,在这种情况下,您的意图不是改变控件的视觉结构;而是改变控件的视觉结构。你只是想改变一个属性。您仍然可以为此使用Triggerand Setter,但您不需要创建模板来执行此操作。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 回答