如何在运行时禁用WPF按钮的鼠标悬停及点击高亮效果?
移除WPF按钮的悬停/点击高亮效果(纯C#实现)
要在纯C#代码里移除WPF按钮的悬停、点击高亮,核心是重写按钮的ControlTemplate——默认按钮的高亮效果完全由模板内的视觉状态触发器控制,去掉这些触发器就能消除高亮。以下是直接可用的代码:
using System.Windows; using System.Windows.Controls; using System.Windows.Media; // 创建按钮并设置基础属性 Button myButton = new Button(); myButton.Content = "无高亮按钮"; myButton.Background = Brushes.LightGray; myButton.Width = 120; myButton.Height = 35; // 构建自定义按钮模板 ControlTemplate buttonTemplate = new ControlTemplate(typeof(Button)); // 创建模板根容器Border FrameworkElementFactory borderFactory = new FrameworkElementFactory(typeof(Border)); // 绑定按钮的Background属性,保持样式一致性 borderFactory.SetValue(Border.BackgroundProperty, new TemplateBindingExtension(Button.BackgroundProperty)); borderFactory.SetValue(Border.CornerRadiusProperty, new CornerRadius(3)); borderFactory.SetValue(Border.BorderThicknessProperty, new Thickness(1)); borderFactory.SetValue(Border.BorderBrushProperty, Brushes.DarkGray); // 添加内容展示容器(用于显示按钮文本/自定义内容) FrameworkElementFactory contentPresenter = new FrameworkElementFactory(typeof(ContentPresenter)); contentPresenter.SetValue(ContentPresenter.HorizontalAlignmentProperty, HorizontalAlignment.Center); contentPresenter.SetValue(ContentPresenter.VerticalAlignmentProperty, VerticalAlignment.Center); borderFactory.AppendChild(contentPresenter); // 将视觉树关联到模板并应用给按钮 buttonTemplate.VisualTree = borderFactory; myButton.Template = buttonTemplate; // 添加到StackPanel myStackPanel.Children.Add(myButton);
关键说明:
FrameworkElementFactory是C#代码中构建WPF视觉树的工具,对应XAML里的元素标签写法- 这个模板只保留了最基础的
Border和ContentPresenter,完全移除了默认模板中控制高亮的VisualStateManager逻辑 - 通过
TemplateBindingExtension绑定按钮的Background属性,确保你设置按钮背景时模板能同步生效 - 如果需要保留极简的点击反馈(比如轻微变色),可以给
Border添加Trigger,但如果完全不需要高亮,上面的代码就足够
内容的提问来源于stack exchange,提问作者Santi
相关产品推荐
相关产品推荐

