/////////////////////////////////////////////////////////////////////////////// //Copyright (c) 2016, 北京探索者软件公司 //All rights reserved. //文件名称: MaskOptions.cs //文件描述: MaskOptions.cs //创 建 者: xls //创建日期: 2018/6/1 8:46:49 //版 本 号:1.0.0.0 //////////////////////////////////////////////////////////////////////////////// using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; namespace FWindSoft.Wpf.Controls { public class MaskOptions { /* * 1、Show的时候判断显示模板,给控件添加装饰层 * 2、通过数据模板去控制具体模板的显示 */ #region 附加属性 /// /// 是否显示遮罩层 /// public static readonly DependencyProperty IsShowProperty = DependencyProperty.RegisterAttached("IsShow", typeof(bool), typeof(MaskOptions), new PropertyMetadata(false, PropertyChanged)); public static bool GetIsShow(DependencyObject obj) { return (bool)obj.GetValue(IsShowProperty); } public static void SetIsShow(DependencyObject obj, object value) { obj.SetValue(IsShowProperty, value); } /// /// 手动控制蒙版隐藏 /// public static readonly DependencyProperty IsManualHideProperty = DependencyProperty.RegisterAttached("IsManualHide", typeof(bool), typeof(MaskOptions), new PropertyMetadata(false, PropertyChanged)); public static bool GetIsManualHide(DependencyObject obj) { return (bool)obj.GetValue(IsManualHideProperty); } public static void SetIsManualHide(DependencyObject obj, object value) { obj.SetValue(IsManualHideProperty, value); } /// /// 遮罩模板 /// public static readonly DependencyProperty MaskTemplateProperty = DependencyProperty.RegisterAttached("MaskTemplate", typeof(ControlTemplate), typeof(MaskOptions), new PropertyMetadata(null, null)); public static ControlTemplate GetMaskTemplate(DependencyObject obj) { return obj.GetValue(MaskTemplateProperty) as ControlTemplate; } public static void SetMaskTemplate(DependencyObject obj, ControlTemplate value) { obj.SetValue(MaskTemplateProperty, value); } /// /// 默认Adorner /// public static readonly DependencyProperty MaskAdornerProperty = DependencyProperty.RegisterAttached(" MaskAdorner", typeof(MaskAdorner), typeof(MaskOptions), new PropertyMetadata(null, null)); public static MaskAdorner GetMaskAdorner(DependencyObject obj) { return obj.GetValue(MaskAdornerProperty) as MaskAdorner; } public static void SetMaskAdorner(DependencyObject obj, MaskAdorner value) { obj.SetValue(MaskAdornerProperty, value); } #endregion private static void PropertyChanged(DependencyObject sender,DependencyPropertyChangedEventArgs args ) { UIElement uIElement = sender as UIElement; if (uIElement == null) return; if (args.Property != IsShowProperty) return; MaskAdorner adorner = uIElement.ReadLocalValue(MaskAdornerProperty) as MaskAdorner; bool show = (bool) args.NewValue; AdornerLayer adornerLayer = AdornerLayer.GetAdornerLayer(uIElement); if (adornerLayer == null) return; if (show) { if (adorner == null) { ControlTemplate maskTemplate = MaskOptions.GetMaskTemplate(uIElement); if (maskTemplate == null) return; adorner = new MaskAdorner(uIElement, maskTemplate); SetMaskAdorner(uIElement, adorner); adorner.MouseLeave += Adorner_MouseLeave; adornerLayer.Add(adorner); } else { adornerLayer.Add(adorner); } } else if (!show && adorner != null) { adorner.MouseLeave -= Adorner_MouseLeave; adornerLayer.Remove(adorner); SetMaskAdorner(uIElement, null); } } private static void Adorner_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) { MaskAdorner adorner = sender as MaskAdorner; if (adorner == null) return; if (MaskOptions.GetIsManualHide(adorner.AdornedElement)) { //如果是手动隐藏,则不自动配置 return; } MaskOptions.SetIsShow(adorner.AdornedElement, false); } } }