鼠标悬停时样式未应用于 WPF 按钮
Style not being applied to WPF button on mouse over
我已经为我的按钮定义了样式:
<Style x:Key="MyStyle" TargetType="{x:Type Button}">
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0 0 0 3"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="Orange" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="BorderBrush" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
现在,我将它应用到 WPF 按钮,如下所示:
<Button>
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource MyStyle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel Orientation="Vertical">
<Image Height="20" Width="20" Stretch="UniformToFill" Source="./Resources/Add.png"/>
<Label HorizontalAlignment="Center">Add</Label>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="BorderBrush" Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
这显示了一个带有图像的按钮和图像下方的标签。
此外,在鼠标悬停时,底部的按钮边框显示为橙色,按下鼠标时它将其底部边框更改为绿色(请注意初始颜色已被覆盖。我有另一个按钮,我想将其底部边框显示为红色按下鼠标时不是绿色)。
我的问题是按钮的底部边框在鼠标悬停时没有显示为橙色。
更新:
正如 Mishka 所说,我忘记了边界...现在看看:
<Button>
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource MyStyle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<StackPanel Orientation="Vertical">
<Image Height="20" Width="20" Stretch="UniformToFill" Source="./Resources/Add.png"/>
<Label HorizontalAlignment="Center">Add</Label>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="BorderBrush" Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
您的 ControlTemplate 中不存在任何对象(例如 'Border')来接收 BorderBrush 的值。
您需要用 Border 包裹您的控件,并将其值(如 BorderBrush 和 BorderThickness、TemplateBinding)绑定到 Button 上的属性:
<Border BorderBrush="{TemplateBinding BorderBrush}">
</Border>
我已经为我的按钮定义了样式:
<Style x:Key="MyStyle" TargetType="{x:Type Button}">
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0 0 0 3"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" Value="Orange" />
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="BorderBrush" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
现在,我将它应用到 WPF 按钮,如下所示:
<Button>
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource MyStyle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel Orientation="Vertical">
<Image Height="20" Width="20" Stretch="UniformToFill" Source="./Resources/Add.png"/>
<Label HorizontalAlignment="Center">Add</Label>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="BorderBrush" Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
这显示了一个带有图像的按钮和图像下方的标签。 此外,在鼠标悬停时,底部的按钮边框显示为橙色,按下鼠标时它将其底部边框更改为绿色(请注意初始颜色已被覆盖。我有另一个按钮,我想将其底部边框显示为红色按下鼠标时不是绿色)。
我的问题是按钮的底部边框在鼠标悬停时没有显示为橙色。
更新:
正如 Mishka 所说,我忘记了边界...现在看看:
<Button>
<Button.Style>
<Style TargetType="Button" BasedOn="{StaticResource MyStyle}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<StackPanel Orientation="Vertical">
<Image Height="20" Width="20" Stretch="UniformToFill" Source="./Resources/Add.png"/>
<Label HorizontalAlignment="Center">Add</Label>
</StackPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="BorderBrush" Value="Green" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
您的 ControlTemplate 中不存在任何对象(例如 'Border')来接收 BorderBrush 的值。
您需要用 Border 包裹您的控件,并将其值(如 BorderBrush 和 BorderThickness、TemplateBinding)绑定到 Button 上的属性:
<Border BorderBrush="{TemplateBinding BorderBrush}">
</Border>