[英]Button Template - IsMouseOver stops working after IsPressed is executed
[英]Button's trigger IsMouseOver stops working after button's background is set in code-behind
當 cursor 懸停在按鈕上時,我希望更改按鈕的背景。
我設法以一種使用“IsMouseOver”觸發器的樣式來做到這一點,該觸發器將按鈕的背景設置為紅色。
當點擊事件發生時,我還希望按鈕在兩個 colors 之間改變它的背景。
我設法在 Window 的代碼隱藏中做到了這一點,它在藍色和綠色之間切換。
問題
只要我不單擊按鈕,觸發器就會按預期工作。
當我單擊按鈕時,背景會按預期更改為藍色或綠色。
如果我然后在 hover 按鈕之后,使用 cursor 懸停時,背景不會設置為紅色。
XAML 代碼
<Window x:Class="Main.MainWindow">
<Window.Resources>
<Style x:Key="FooStyle" TargetType="Button">
<Setter Property="Foreground" Value="White" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Background" Value="Blue" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}" BorderBrush="Transparent">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<StackPanel Orientation="Vertical">
<Button x:Name="btnFoo"
Content="Foo"
Width="100"
Click="Foo_Click"
Style="{StaticResource FooStyle}" />
</StackPanel>
</Window>
Window 代碼隱藏
private void Foo_Click(object sender, RoutedEventArgs e)
{
btnFoo.Background = btnFoo.Background == Brushes.Blue ? Brushes.Lime : Brushes.Blue;
}
我懷疑觸發器確實有效,但問題在於這里的其他東西。
可能是什么問題呢?
如何解決這個問題?
可能是什么問題呢?
如文檔中所述,本地值優先於樣式設置器和觸發器的事實。
如何解決這個問題?
例如,通過將觸發器移動到ControlTemplate
:
<Style x:Key="FooStyle" TargetType="Button">
<Setter Property="Foreground" Value="White" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Background" Value="Blue" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="Transparent">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="Red" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Window.Resources>
<Style x:Key="FooStyle" TargetType="Button">
<Setter Property="Foreground" Value="White" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Background" Value="Blue" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}" BorderBrush="Transparent">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid>
<StackPanel Orientation="Vertical">
<Button x:Name="btnFoo"
Content="Foo"
Width="100"
Click="BtnFoo_Click"
MouseEnter="BtnFoo_MouseEnter"
MouseLeave="BtnFoo_MouseLeave"
Style="{StaticResource FooStyle}" />
</StackPanel>
</Grid>
Code Behind
Brush color { get; set; }
private void BtnFoo_Click(object sender, RoutedEventArgs e)
{
color= color == Brushes.Lime ? Brushes.Blue : Brushes.Lime;
btnFoo.Background = color;
}
private void BtnFoo_MouseEnter(object sender, MouseEventArgs e)
{
btnFoo.ClearValue(Button.BackgroundProperty);
}
private void BtnFoo_MouseLeave(object sender, MouseEventArgs e)
{
btnFoo.Background = color==null?btnFoo.Background:color;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.