废话不多说,客官先看图
在WPF 中,控件禁用的时候,虽然可以利用触发器去修改控件的本身的样式,但是,鼠标样式Cursor确不会生效。可是产品和UI怎么会放过你呢,毕竟web控件可是可以改的。
解决方案:
利用装饰器和附加属性,完美继承原先的样式和逻辑,而且对所有控件都有效;
装饰器代码:
思路很简单,就是给控件添加一个蒙层,禁用的时候,鼠标其实是位于在蒙层上;
public class UnableAdorner : Adorner
private readonly VisualCollection _collection;
private readonly Grid _grid;
private Border _border;
protected override int VisualChildrenCount => _collection.Count;
protected override Visual GetVisualChild(int index) => _collection[index];
public UnableAdorner(UIElement uIElement) : base(uIElement) {
_collection = new VisualCollection(this);
_grid = new Grid();
_border = new Border()
Background = Brushes.Transparent,
Cursor = (Cursor)TryFindResource("UnableCursor") ?? Cursors.No,
_grid.Children.Add(_border);
_collection.Add(_grid);
public void SetEnable(bool isEnable) {
_border.IsHitTestVisible = !isEnable;
protected override Size MeasureOverride(Size constraint)
return base.MeasureOverride(constraint);
protected override Size ArrangeOverride(Size finalSize)
_grid.Arrange(new Rect(finalSize));
return base.ArrangeOverride(finalSize);
附加属性:
利用附加属性,给控件添加对应的装饰器
public class Assists
#region 控件IsEnable 属性,用于重写IsEnable样式
public static bool GetIsEnable(DependencyObject obj)
return (bool)obj.GetValue(IsEnableProperty);
public static void SetIsEnable(DependencyObject obj, bool value)
obj.SetValue(IsEnableProperty, value);
// Using a DependencyProperty as the backing store for IsEnable. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsEnableProperty =
DependencyProperty.RegisterAttached("IsEnable", typeof(bool), typeof(Assists), new PropertyMetadata(true, IsEnablePropertyChanged));
private static void IsEnablePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
if (d is UIElement uIElement) {
var adorner = (UnableAdorner)uIElement.GetOrAddAdorner(typeof(UnableAdorner));
adorner.SetEnable((bool)e.NewValue);
#endregion
注意:装饰器使用的时候 需要AdornerDecorator;
源码地址:https://github.com/Super0Lan/ControlDesign
使用通用附加属性来减少 WPF 元素自定义样式的多余代码魏刘宏2022 年 11 月 07 日本文将以WPFUI(https://gitee.com/dlgcy/WPFUI)项目中的 ComboBox样式为例,介绍如何使用附加属性来增强和简化样式代码。一、自定义元素样式的方法在开发 WPF 应用的过程中,我们常常需要给元素设置样式,其中一种方法是创建自定义样式,套路如下:在设计器的元素上右键 -...
样式基础
样式是一种重要的资源。
样式是属性值的集合,能被应用到一个元素。就像CSS,WPF样式允许你定义格式化特性并且遍及应用程序地应用它们去确保一致性。就像CSS,WPF样式可以级联通过元素树自动地应用到指定的元素类型的目标。而且,WPF样式更强力,因为他...
当你打开某一些软件时是不是发现,当你点击一个页面就会出现一堆按钮,这时就会发现有一些按钮是点击不了的,是被禁止的,然而当你点击其他的东西时,被禁止的按钮就会神奇的恢复,就可以点击了,关于按钮被禁止的代码是怎么写的,我们来看一下(我以WPF为例子)。
首先第一步:
功能思路:这个功能要呈现的效果是,当你打开这个页面要新增时,只有新增按钮是可...
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/express..
Mouse.OverrideCursor = Cursors.Wait;try{
}finally{ Mouse.OverrideCursor = null;}
public class OverrideCursor : IDisposable{ public OverrideCursor(Cursor changeToCursor) { Mou...
每次写blog一定是我遇到什么实际问题了。而这次的问题,和文章标题没有特别大的关系。因为上一篇文我讲到了自定义日历控件(Calendar)的事,在我改CalendarDayButtonStyle的过程中,我发现默认的Style中出现了大量的VisualState标签。但正如上文中所说,一个自身的WPF程序员或许对VisualState相关类也会感到陌生,更何况我呢。于是我决定,对VisualState相关类进行学习。我打开微软官网,搜了下VisualState,首先在Windows App SDK的内容中看
鼠标禁用样式:
鼠标禁用事件:
元素永远不会成为鼠标事件的target。但是,当其后代元素的pointer-events属性指定其他值时,鼠标事件可以指向其后代元素。如果同时使用 ,鼠标为默认样式;
解决方法:外层添加盒子将样式分开
外部盒子使用cursor: not-allowed;(cursor:no-drop)
内部盒子使用pointer-events: none;
不使用鼠标禁用事件,而是在鼠标点击事件中做判断...