[英]Button's trigger IsMouseOver stops working after button's background is set in code-behind
[英]Losing Style trigger after Code-Behind changes background/foreground
我试图使按钮像不和谐按钮一样具有三个状态。 有效(单击后),完全无效,然后将鼠标悬停。 您可以在此处看到所有这三种状态的颜色变化: https : //i.imgur.com/Mkc2Ro4.png
问题出在Click事件之后,因为要将其更改为基本状态,我直接设置了BG / FR。 当我这样做时,鼠标悬停事件将在那之后在该按钮中停止工作。 有什么想法可以在不影响样式触发的情况下如何将bg / fr设置为其初始值?
我尝试使用动态颜色,但根本没有设置。 所以我有点迷茫,TBH。
按钮的样式:
<Style x:Key="MainMenuStyle" TargetType="{x:Type Button}">
<Setter Property="Background" Value="#FF303136"/>
<Setter Property="Foreground" Value="#FF6F7074"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border Background="{TemplateBinding Background}" Padding="30, 0, 0, 0">
<ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF2A2A32"/>
<Setter Property="Foreground" Value="#FFBBBCB8"/>
</Trigger>
</Style.Triggers>
</Style>
点击事件:
private void Main_Menu_Swap(object sender, RoutedEventArgs e)
{
Button s = e.Source as Button;
if (s != null)
{
InicioButton.Background = (Brush)new BrushConverter().ConvertFrom("#FF303136");
InicioButton.Foreground = (Brush)new BrushConverter().ConvertFrom("#FF6F7074");
RelatoriosButton.Background = (Brush)new BrushConverter().ConvertFrom("#FF303136");
RelatoriosButton.Foreground = (Brush)new BrushConverter().ConvertFrom("#FF6F7074");
AdministracaoButton.Background = (Brush)new BrushConverter().ConvertFrom("#FF303136");
AdministracaoButton.Foreground = (Brush)new BrushConverter().ConvertFrom("#FF6F7074");
s.Background = (Brush)new BrushConverter().ConvertFrom("#FF42464F");
s.Foreground = (Brush)new BrushConverter().ConvertFrom("#FFCFD6DC");
}
}
纽扣:
<Button x:Name="InicioButton" Content="Início" Click="Main_Menu_Swap" Style="{StaticResource MainMenuStyle}" HorizontalAlignment="Left" Margin="0,56,0,0" VerticalAlignment="Top" Width="155" Height="32" BorderThickness="0" Focusable="False" FontFamily="Arial" FontSize="15" Padding="30,0,0,0"/>
<Button x:Name="RelatoriosButton" Click="Main_Menu_Swap" Content="Relatórios" Style="{StaticResource MainMenuStyle}" HorizontalAlignment="Left" Margin="0,152,0,0" VerticalAlignment="Top" Width="155" Height="32" BorderThickness="0" Focusable="False" FontFamily="Arial" FontSize="15" Padding="30,0,0,0"/>
<Button x:Name="AdministracaoButton" Click="Main_Menu_Swap" Content="Administração" Style="{StaticResource MainMenuStyle}" HorizontalAlignment="Left" Margin="0,184,0,0" VerticalAlignment="Top" Width="155" Height="32" BorderThickness="0" Focusable="False" FontFamily="Arial" FontSize="15" Padding="30,0,0,0"/>
依赖项属性概述 :
绑定被视为本地值,这意味着如果您设置另一个本地值,则将消除绑定。 有关详细信息,请参见依赖项属性值优先级。
如果您对Click
事件感兴趣,则应使用EventTrigger
(或VisualStateManager
)来使用XAML来操纵Button
状态:
<Style x:Key="MainMenuStyle"
TargetType="{x:Type Button}">
<Setter Property="Background"
Value="#FF303136" />
<Setter Property="Foreground"
Value="#FF6F7074" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="ButtonBorder" Background="{TemplateBinding Background}"
Padding="30, 0, 0, 0">
<ContentPresenter HorizontalAlignment="Left"
VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Click">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetName="ButtonBorder"
Storyboard.TargetProperty="Background.(SolidColorBrush.Color)"
Duration="0:0:0"
To="Coral" />
<ColorAnimation Storyboard.Target="{Binding RelativeSource={RelativeSource TemplatedParent}}"
Storyboard.TargetProperty="Foreground.(SolidColorBrush.Color)"
Duration="0:0:0"
To="White" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
但是,如果您只想提供按钮单击反馈,则应在Button.IsPressed
属性上触发:
<Style x:Key="MainMenuStyle"
TargetType="{x:Type Button}">
<Setter Property="Background"
Value="#FF303136" />
<Setter Property="Foreground"
Value="#FF6F7074" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="ButtonBorder" Background="{TemplateBinding Background}"
Padding="30, 0, 0, 0">
<ContentPresenter HorizontalAlignment="Left"
VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background"
Value="Coral" />
<Setter Property="Foreground"
Value="White" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
设置背景颜色的原因是IsMouseOver
触发器。 您描述的从Button.Click
事件处理程序切换样式的解决方案并不干净,无法回答您的问题。
您希望Button
在单击(选择)时改变颜色,同时将鼠标悬停在效果上。
因此,我建议用ToggleButton
替换Button
。 ToggleButton
提供两种开箱即用的状态(选中和未选中):
<Style x:Key="MainMenuStyle"
TargetType="{x:Type ToggleButton}">
<Setter Property="Background"
Value="#FF303136" />
<Setter Property="Foreground"
Value="#FF6F7074" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ToggleButton}">
<Border x:Name="ButtonBorder" Background="{TemplateBinding Background}"
Padding="30, 0, 0, 0">
<ContentPresenter HorizontalAlignment="Left"
VerticalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background"
Value="Coral" />
<Setter Property="Foreground"
Value="White" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background"
Value="#FF2A2A32" />
<Setter Property="Foreground"
Value="#FFBBBCB8" />
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="True" />
<Condition Property="IsMouseOver" Value="True" />
</MultiTrigger.Conditions>
<Setter Property="Background"
Value="Coral" />
<Setter Property="Foreground"
Value="#FFBBBCB8" />
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.