在项目中,用户设置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;            }        }    }

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐