设计响应触发器,定义和使用 WPF
本文关键字:WPF 定义 响应 触发器 | 更新日期: 2023-09-27 18:36:51
最近我读到了样式和控件模板。正如它所说,控件模板负责整个控件设计。但是,例如,当我写这篇文章时,我只想更改默认控件模板的特定部分,例如,当鼠标悬停或控件具有焦点时:
<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>
..整个模板被覆盖了...而且它有点不酷...
那么如何只更改鼠标悬停视觉样式,而不覆盖整个默认样式呢?
整个
模板被替换了,因为你的 XAML 说,"将Template
设置为我在此处声明的此ControlTemplate
。 问题是,您的模板是空的。 如果要告诉 WPF"使用此可视化树表示控件",请使用模板。 你给了它一个空的视觉树,并得到了你想要;)的东西。
但是,在这种情况下,您的意图不是更改控件的可视结构;您只想更改属性。 您仍然可以为此使用 Trigger
和Setter
,但无需创建模板即可执行此操作。 Style
有自己的触发器集合,因此您可以将其移动到那里:
<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 模板应确保绘制 TextBox 的背景符合模板化父级的 Background
属性。
操作自定义模板中声明的特定子元素,模板上的触发器更有用。