You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中IsMouseOver属性仅能生效一次的问题求助

WPF按钮IsMouseOver点击后失效的解决方案

问题根源

你在点击事件中直接给Button的Background属性赋值,这属于本地属性值。在WPF的属性值优先级体系中,本地值的优先级远高于Style中的触发器设置。一旦设置了本地值,Style里的IsMouseOver触发器就无法再修改Background属性,导致点击后悬停效果失效。

解决方案

放弃直接设置Background本地值,改用DataTrigger绑定选中状态的方式,将所有背景色控制逻辑统一放在Style中,避免本地值的干扰。

步骤1:添加窗口级依赖属性管理选中状态

在MainWindow.xaml.cs中定义一个依赖属性,用来记录当前选中的按钮名称:

using System.Windows;

namespace KrakenZ_Tweaker
{
    public partial class MainWindow : Window
    {
        // 定义依赖属性,用于绑定选中按钮的名称
        public static readonly DependencyProperty SelectedButtonNameProperty =
            DependencyProperty.Register("SelectedButtonName", typeof(string), typeof(MainWindow), new PropertyMetadata("Restore_Point"));

        public string SelectedButtonName
        {
            get { return (string)GetValue(SelectedButtonNameProperty); }
            set { SetValue(SelectedButtonNameProperty, value); }
        }

        public MainWindow()
        {
            InitializeComponent();
        }

        // 原点击事件修改如下...
    }
}

步骤2:统一按钮样式并添加DataTrigger

将所有按钮的Style移到Window.Resources中,统一管理,并添加DataTrigger绑定选中状态,同时保留IsMouseOver触发器:

<Window x:Class="KrakenZ_Tweaker.MainWindow"
    ResizeMode="CanMinimize"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:KrakenZ_Tweaker"
    mc:Ignorable="d"
    Title="KrakenZ Tweaker" Height="700" Width="1000" >
<Window.Resources>
    <!-- 统一导航按钮样式 -->
    <Style x:Key="NavButtonStyle" TargetType="{x:Type Button}">
        <Setter Property="Background" Value="#121820"/>
        <Setter Property="Foreground" Value="White"/>
        <Setter Property="FontFamily" Value="Bahnschrift"/>
        <Setter Property="FontSize" Value="25"/>
        <Setter Property="BorderBrush" Value="{x:Null}"/>
        <Setter Property="Cursor" Value="Hand"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Button}">
                    <!-- 直接在Template里设置圆角,避免每个按钮单独加Resources -->
                    <Border Background="{TemplateBinding Background}" CornerRadius="8">
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <!-- 绑定选中状态:当按钮名称与窗口的SelectedButtonName一致时,设置选中背景色 -->
            <DataTrigger Binding="{Binding SelectedButtonName, RelativeSource={RelativeSource AncestorType=Window}}" 
                         Value="{Binding Name, RelativeSource={RelativeSource Self}}">
                <Setter Property="Background" Value="#175EBD"/>
            </DataTrigger>
            <!-- 鼠标悬停效果:优先级高于选中状态,确保悬停时始终显示金色背景 -->
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="DarkGoldenrod"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<Grid Background="#FF4E4E4E" Margin="0,0,0,0" >
    <StackPanel HorizontalAlignment="Left" Background="#FF121820" Height="700" Width="300">
        <Image  HorizontalAlignment="Center" Margin="0,30,0,12" Height="125" Width="140" Source="/KrakenZ-Tweaker-Logo.ico"/>
        <TextBlock Margin="0,0,0,9" TextWrapping="Wrap" Text="  KrakenZ Tweaker" FontFamily="Montserrat" FontSize="30" Foreground="White" Height="34" Width="257"/>
        <Separator Width="187" Height="8" Background="Gray"/>
        <!-- 引用统一样式,简化按钮代码 -->
        <Button x:Name="Restore_Point" Margin="10" Height="47" Width="279" 
                Content="Restore Point" Click="Restore_Point_Click"
                Style="{StaticResource NavButtonStyle}"/>
        <Button x:Name="Disable_Unnecessary_Services" Margin="10" Height="47" Width="279" 
                Content="Disable Services" Click="Disable_Unnecessary_Services_Click"
                Style="{StaticResource NavButtonStyle}"/>
        <Button x:Name="Clear_Junk_Files" Margin="10" Height="47" Width="279" 
                Content="Clear Junk Files" Click="Clear_Junk_Files_Click"
                Style="{StaticResource NavButtonStyle}"/>
        <Button x:Name="Useful_Optimization" Margin="10" Height="47" Width="279" 
                Content="Useful Optimizations" Click="Useful_Optimization_Click"
                Style="{StaticResource NavButtonStyle}"/>
    </StackPanel>
    <StackPanel x:Name="User_Control" Margin="308,2,6,0"/>
</Grid>
</Window>

步骤3:修改点击事件逻辑

去掉所有直接设置Background的代码,改为设置SelectedButtonName属性:

private void Restore_Point_Click(object sender, RoutedEventArgs e)
{
    SelectedButtonName = "Restore_Point";
    User_Control.Children.Remove(UC2);
    User_Control.Children.Remove(UC3);
    User_Control.Children.Remove(UC4);
    User_Control.Children.Add(defaultUC);
}

private void Disable_Unnecessary_Services_Click(object sender, RoutedEventArgs e)
{
    SelectedButtonName = "Disable_Unnecessary_Services";
    User_Control.Children.Remove(defaultUC);
    User_Control.Children.Remove(UC3);
    User_Control.Children.Remove(UC4);
    User_Control.Children.Add(UC2);
}

private void Clear_Junk_Files_Click(object sender, RoutedEventArgs e)
{
    SelectedButtonName = "Clear_Junk_Files";
    User_Control.Children.Remove(defaultUC);
    User_Control.Children.Remove(UC2);
    User_Control.Children.Remove(UC4);
    User_Control.Children.Add(UC3);
}

private void Useful_Optimization_Click(object sender, RoutedEventArgs e)
{
    SelectedButtonName = "Useful_Optimization";
    User_Control.Children.Remove(defaultUC);
    User_Control.Children.Remove(UC2);
    User_Control.Children.Remove(UC3);
    User_Control.Children.Add(UC4);
}

效果说明

  • 点击按钮后,通过DataTrigger自动切换选中按钮的背景色,不会产生本地值覆盖问题
  • 无论按钮是否被选中,鼠标悬停时都会触发IsMouseOver触发器,显示金色背景
  • 统一的样式减少了重复代码,后续修改按钮样式只需调整一处即可

内容的提问来源于stack exchange,提问作者KrakenZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:10:27