WPF开源控件【Newbeecoder.UI】遮罩层
在项目中,用户设置IsEnabled为False时,控件不可用,当控件不可用可以给它增加遮罩层。用户就点不到控件。下面来分解一下遮罩层实现原理:定有不可用装饰类,DisabledAdorner继承Adorner装饰类。Adorner是继承FrameworkElement元素基类。定义集合VisualCollectione用于添加Grid,定义Grid容器用于遮罩控件。private VisualC
在项目中,用户设置IsEnabled为False时,控件不可用,当控件不可用可以给它增加遮罩层。用户就点不到控件。
下面来分解一下遮罩层实现原理:
定有不可用装饰类,DisabledAdorner继承Adorner装饰类。Adorner是继承FrameworkElement元素基类。
定义集合VisualCollectione用于添加Grid,定义Grid容器用于遮罩控件。
private VisualCollection _visCollec;
private Grid _grid;
在构造方法中定义参数UIElement和Cursor,UIElement是形参控件,Cursor是光标样式。比如Cursors.No表示光标不可用。
构造方法DisabledAdorner中,先把光标样式传给控件光标,初始化VisualCollection集合,初始化Grid容器,定义Border背景为透明色,Background = Brushes.Transparent,光标样式取传参值,把Border添加到Gird容器中,WindowChrome.GetIsHitTestVisibleInChrome是获取传参控件是否接收事件,adornedElement.IsEnabledChanged += AdornedElement_IsEnabledChanged 给控件设置IsEnabled改变后设置遮罩层是否可见。
重写ArrangeOverride和GetVisualChild,VisualChildrenCount分别是获取确定元素大小,获得集合索引和获取集合数量。
最后我们调用遮罩层,实现控件遮罩作用。
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)