为什么我的文本框对 ControlTemplate 样式中的 IsMouseOver 没有反应
Why doesn't my Textbox react on IsMouseOver in the Style for the ControlTemplate
所以我尝试稍微调整一下我的 TextBox 的样式,当时的想法是我想在将鼠标悬停在 TextBox 上时调整 BorderBrush 的样式,但由于某种原因它没有更改边框,所以我也尝试更改背景, 那里也一样。就在那时我意识到它不会对 IsMouseOver
做出反应,但它确实设置了背景和我所做的所有其他事情,这只是它没有反应的事件 IsMouseOver
。
控制
<TextBox Width="700"
Height="340"
HorizontalAlignment="Right"
Margin="0,0,230,140"
Foreground="#8bf502"
TextWrapping="Wrap"
Style="{DynamicResource TextboxStyle}"/>
风格
<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
<Setter Property="OverridesDefaultStyle" Value="True"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border Background="#424242">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="Orange"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
要更改边框的背景,请为边框命名并将 TargetName="MyBorder" 添加到 Setter
您缺少 TargetName
和 BorderThickness
:
<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
<Setter Property="OverridesDefaultStyle" Value="True"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border Name="border" BorderThickness="2" Background="#424242">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="Orange"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
没有 Border
除非你将它的 BorderThickness
属性 设置为 0
以外的其他值。
您正在使用自定义 Template
,但您的模板不应用模板 TextBox
的边框属性。尝试将以下内容添加到模板中的 Border
元素:
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
实际上有几种方法可以解决这个问题:使用模板绑定并将触发器放在 Style
中;使用模板绑定并将触发器放在模板中;使用明确的目标元素并将触发器放在模板中(正如其他人所建议的那样);等 "right" 方法取决于 how/if 您希望控件在 属性 更改时做出响应。例如:如果有人直接在 TextBox
上设置了一个新的 BorderBrush
,您是否希望它取代您的橙色悬停效果?值得阅读依赖属性的 value precedence 以了解某些属性的设置方式和位置的含义。
值得注意的是,您的模板不完整,如果您希望文本可编辑(或可选择),则无法使用。 TextBox
期望它的模板有一个特别命名的 ScrollViewer
,可以在其中注入可编辑的文本视图。尝试用以下内容替换您的 ContentPresenter
:
<ScrollViewer x:Name="PART_ContentHost"
Padding="{TemplateBinding Padding}" />
请注意 x:Name
属性必须完全匹配。
所以我尝试稍微调整一下我的 TextBox 的样式,当时的想法是我想在将鼠标悬停在 TextBox 上时调整 BorderBrush 的样式,但由于某种原因它没有更改边框,所以我也尝试更改背景, 那里也一样。就在那时我意识到它不会对 IsMouseOver
做出反应,但它确实设置了背景和我所做的所有其他事情,这只是它没有反应的事件 IsMouseOver
。
控制
<TextBox Width="700"
Height="340"
HorizontalAlignment="Right"
Margin="0,0,230,140"
Foreground="#8bf502"
TextWrapping="Wrap"
Style="{DynamicResource TextboxStyle}"/>
风格
<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
<Setter Property="OverridesDefaultStyle" Value="True"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border Background="#424242">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="Orange"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
要更改边框的背景,请为边框命名并将 TargetName="MyBorder" 添加到 Setter
您缺少 TargetName
和 BorderThickness
:
<Style TargetType="{x:Type TextBox}" x:Key="TextboxStyle">
<Setter Property="OverridesDefaultStyle" Value="True"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Border Name="border" BorderThickness="2" Background="#424242">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"></ContentPresenter>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="BorderBrush" Value="Orange"></Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
没有 Border
除非你将它的 BorderThickness
属性 设置为 0
以外的其他值。
您正在使用自定义 Template
,但您的模板不应用模板 TextBox
的边框属性。尝试将以下内容添加到模板中的 Border
元素:
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
实际上有几种方法可以解决这个问题:使用模板绑定并将触发器放在 Style
中;使用模板绑定并将触发器放在模板中;使用明确的目标元素并将触发器放在模板中(正如其他人所建议的那样);等 "right" 方法取决于 how/if 您希望控件在 属性 更改时做出响应。例如:如果有人直接在 TextBox
上设置了一个新的 BorderBrush
,您是否希望它取代您的橙色悬停效果?值得阅读依赖属性的 value precedence 以了解某些属性的设置方式和位置的含义。
值得注意的是,您的模板不完整,如果您希望文本可编辑(或可选择),则无法使用。 TextBox
期望它的模板有一个特别命名的 ScrollViewer
,可以在其中注入可编辑的文本视图。尝试用以下内容替换您的 ContentPresenter
:
<ScrollViewer x:Name="PART_ContentHost"
Padding="{TemplateBinding Padding}" />
请注意 x:Name
属性必须完全匹配。