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