码迷,mamicode.com
首页 > Windows程序 > 详细

WPF 基于Adorner实现类似Popup效果

时间:2018-11-02 16:40:22      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:class   border   toolbar   ble   对象   htm   div   句柄   其他   

1.  什么是Adorner

     装饰器是一种特殊类型的FrameworkElement,可用来向用户提供可视提示。 装饰器有很多用途,可用来向元素添加功能句柄,或者提供有关某个控件的状态信息。

 

2.  使用Adorner实现Popup的原因

     1. 通过AdornerLayer存在与独立的布局系统,不会与界面布局环论

     2. 使用过WPF中的Popup就可以知道Popup中有许多的限制(例如需要实现某些效果比较麻烦)

 

3. 效果

技术分享图片

 

4. 主要实现

    1. Popup中当StaysOpen为False的情况下,当打开Popup后如果再点击其他区域时将会关闭Popup的实现(实现方法参考自Popup, 但是不采用Mouse.Capture(element),因为会导致其他控件无法收到鼠标实现

技术分享图片
            if (StaysOpen)
                return;

            Point pos = e.GetPosition(ListenMouseElement);
            HitTestResult hitResult = VisualTreeHelper.HitTest(ListenMouseElement, pos);

            if (hitResult == null)
            {
                IsOpen = false;
                return;
            }

            // 如果点击对象对Child则返回
            if (TreeHelper.IsDescendantOf(hitResult.VisualHit, _adorner))
            {
                return;
            }

            // 如果点击对象PlacementTarget则返回
            if (IgnoreTargetEvent && TreeHelper.IsDescendantOf(hitResult.VisualHit, PlacementTarget))
            {
                return;
            }

            IsOpen = false;
技术分享图片

 

    2. 派生Adorner 将AdornerPopup的Child属性加载到Adorner

技术分享图片
        public FrameworkElementAdorner(FrameworkElement adornerChildElement, FrameworkElement adornedElement,
            AdornerPopup adorner,
            double horizontalOffset
            , double verticalOffset) : base(adornedElement)
        {
            this._child = adornerChildElement;
            this._adorner = adorner;
            this._bgBorder = CreateBackgroundBorder(adornerChildElement);

            this.HorizontalOffset = horizontalOffset;
            this.VerticalOffset = verticalOffset;
        // 通过BaseLogicalChild, AddVisualChild将Child元素加载到可视树中
            base.AddLogicalChild(_bgBorder);
            base.AddVisualChild(_bgBorder);
        }
技术分享图片

 

代码已开源:https://gitee.com/1Jins/WPF-AdornerPopup

 

5. 参考文献

装饰器概述    https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/controls/adorners-overview

原文:https://www.cnblogs.com/CLink/p/9896432.html

WPF 基于Adorner实现类似Popup效果

标签:class   border   toolbar   ble   对象   htm   div   句柄   其他   

原文地址:https://www.cnblogs.com/robertyao/p/9896807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!