我目前正在尝试为WPF中的ControlTemplate
类创建一个Button
,将常用的可视化树替换为使该按钮看起来类似于Google上的小(X)关闭图标的内容Chrome的标签。我决定在XAML中使用Path
对象来实现这种效果。使用属性触发器,控件通过设置图标的红色背景来响应IsMouseOver属性的更改。
以下是测试应用程序中的XAML:
<Window x:Class="Widgets.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<Style x:Key="borderStyle" TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="#CC0000"/>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<ControlTemplate x:Key="closeButtonTemplate" TargetType="Button">
<Border Width="12" Height="12" CornerRadius="6"
BorderBrush="#AAAAAA" Background="Transparent"
Style="{StaticResource borderStyle}"
ToolTip="Close">
<Viewbox Margin="2.75">
<Path Data="M 0,0 L 10,10 M 0,10 L 10,0" Stroke="{Binding BorderBrush, RelativeSource={RelativeSource FindAncestor, AncestorType=Border, AncestorLevel=1}}" StrokeThickness="1.8"/>
</Viewbox>
</Border>
</ControlTemplate>
</Window.Resources>
<Grid Background="White">
<Button Template="{StaticResource closeButtonTemplate}"/>
</Grid>
</Window>
请注意,圆形背景始终存在 - 当鼠标悬停在它上面时,它只是透明的。
问题在于触发器无效。按钮的外观没有任何变化。但是,如果我从Background="Transparent"
中的Border
对象中删除ControlTemplate
值,则触发器会工作(尽管只有在'X'之后)。
我实在无法解释这一点。放置在borderStyle
资源中的任何其他属性的设置工作正常,但Background
设置器在ControlTemplate
中指定默认背景时失败。
任何想法为什么会发生以及我如何解决它?我知道我可以轻松地用例如基于.PNG的图像替换此代码,但我想了解当前实现无效的原因。
谢谢! :)
答案 0 :(得分:6)
尝试将明确的“背景”赋值从Border声明内部移动到Style本身:
<Style x:Key="borderStyle" TargetType="Border">
<Setter Property="Background" Value="Transparent" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="#CC0000"/>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
...
<Border Width="12" Height="12" CornerRadius="6"
BorderBrush="#AAAAAA"
Style="{StaticResource borderStyle}"
ToolTip="Close">
样式不能覆盖已显式设置的属性。您需要在样式中设置值。
答案 1 :(得分:0)
我认为你的问题是边框在透明时不会“捕获”鼠标事件。
要验证 - 尝试将背景更改为#01FFFFFF而不是透明。