WPF开源控件【Newbeecoder.UI】遮罩层

92 篇文章 9 订阅
92 篇文章 24 订阅

在项目中,用户设置IsEnabled为False时,控件不可用,当控件不可用可以给它增加遮罩层。用户就点不到控件。

下面来分解一下遮罩层实现原理:

定有不可用装饰类,DisabledAdorner继承Adorner装饰类。Adorner是继承FrameworkElement元素基类。

定义集合VisualCollectione用于添加Grid,定义Grid容器用于遮罩控件。

private VisualCollection _visCollec;

private Grid _grid;

在构造方法中定义参数UIElement和Cursor,UIElement是形参控件,Cursor是光标样式。比如Cursors.No表示光标不可用。

b849f715a3f4ed712d0fd4c6b8ed69e0.png

构造方法DisabledAdorner中,先把光标样式传给控件光标,初始化VisualCollection集合,初始化Grid容器,定义Border背景为透明色,Background = Brushes.Transparent,光标样式取传参值,把Border添加到Gird容器中,WindowChrome.GetIsHitTestVisibleInChrome是获取传参控件是否接收事件,adornedElement.IsEnabledChanged += AdornedElement_IsEnabledChanged 给控件设置IsEnabled改变后设置遮罩层是否可见。

4aeb64d0b11a4f46013351b958902ef1.png

重写ArrangeOverride和GetVisualChild,VisualChildrenCount分别是获取确定元素大小,获得集合索引和获取集合数量。

d1279917faa2a915017a759b5a24215e.png

最后我们调用遮罩层,实现控件遮罩作用。

 

IsEnabled为false时。鼠标放上去有遮罩效果,并且光标不可用。

public class DisabledAdorner : Adorner    {        private VisualCollection _visCollec;        private Grid _grid;        /// <summary>        ///         /// </summary>        /// <param name="adornedElement"></param>        public DisabledAdorner(UIElement adornedElement) : this(adornedElement, Cursors.No)        {        }        /// <summary>        ///         /// </summary>        /// <param name="adornedElement"></param>        /// <param name="cursor"></param>        public DisabledAdorner(UIElement adornedElement, Cursor cursor) : base(adornedElement)        {            Cursor = cursor;            _visCollec = new VisualCollection(this);            _grid = new Grid();            var border = new Border()            {                Background = Brushes.Transparent,                Cursor = cursor,            };            _grid.Children.Add(border);            var isHit = WindowChrome.GetIsHitTestVisibleInChrome(adornedElement);            WindowChrome.SetIsHitTestVisibleInChrome(_grid, isHit);            adornedElement.IsEnabledChanged += AdornedElement_IsEnabledChanged;            this.Visibility = adornedElement.IsEnabled ? Visibility.Collapsed : Visibility.Visible;            _visCollec.Add(_grid);        }        private void AdornedElement_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)        {            this.Visibility = (bool)e.NewValue ? Visibility.Collapsed : Visibility.Visible;        }        protected override Size ArrangeOverride(Size finalSize)        {            _grid.Arrange(new Rect(finalSize));            return finalSize;        }        protected override Visual GetVisualChild(int index)        {            return _visCollec[index];        }        protected override int VisualChildrenCount        {            get            {                return _visCollec.Count;            }        }    }

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值