WPF 基于Adorner实现类似Popup效果
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效果的更多相关文章
- 总结开发中基于DevExpress的Winform界面效果
DevExpress是一家全球知名的控件开发公司, DevExpress 也特指此公司出品的控件集合或某系列控件或其中某控件.我们应用最为广泛的是基于Winform的DevExpress控件组,本篇随 ...
- 使用 Sticky-Kit 实现基于 jQuery 的元素固定效果
元素固定效果在网页中应用得很多,比较常见的使用场景有改进导航,显示广告.Sticky-Kit 是一个非常方便的 jQuery 插件,简化了创建/管理粘元素,有复杂的使用功能.这些功能包括:处理多个固定 ...
- 基于css3的轮播效果
花了一上午来调整页面在ie10上的显示问题,sass编译生成的css文件在ie内核下一直不能正确加载,果然兼容性的问题还需要好好研究.转入正题,用css3实现轮播效果主要是基于css3的framewo ...
- 推荐20款基于 jQuery & CSS 的文本效果插件
jQuery 和 CSS 可以说是设计和开发行业的一次革命.这一切如此简单,快捷的一站式服务.jQuery 允许你在你的网页中添加一些真正令人惊叹的东西而不用付出很大的努力,要感谢那些优秀的 jQue ...
- WPF文本框密码框添加水印效果
WPF文本框密码框添加水印效果 来源: 阅读:559 时间:2014-12-31 分享: 0 按照惯例,先看下效果 文本框水印 文本框水印相对简单,不需要重写模板,仅仅需要一个VisualBrush ...
- 基于jQuery标题有打字效果的焦点图
给大家分享一款基于jQuery标题有打字效果的焦点图.之前为大家分享了好多jquery的焦点图.这款焦点图适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗 ...
- 实现js的类似alert效果的函数
这个简单的类似alert的函数,效果还行,至于css样式,那没的说了,笔者确实尽力了,如果读者觉得太烂,你可以随便改函数的样式的,反正,笔者觉得还可以,呵呵. <!DOCTYPE html PU ...
- wpf实现IE菜单栏自动隐藏效果
IE菜单栏默认为隐藏状态,按下键盘Alt键后显示,菜单失去焦点则自动隐藏.下面说说WPF中如何实现这样的效果. 第一步:Menu默认设置为隐藏(Visibility="Collapsed&q ...
- 基于jQuery Tooltips悬停提示效果
基于jQuery Tooltips悬停提示效果.这是一款基于jquery.tooltipster插件实现的jQuery Tooltips Hover effect特效.效果图如下: 在线预览 源码 ...
随机推荐
- leecode第二十一题(合并两个有序链表)
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode ...
- USBCAN的使用和上位机开发(MFC)
USBCAN使用手册 参见:https://blog.51cto.com/12572800/2062839 1. USB CAN软件安装与硬件接线 USB CAN是常用的CAN测试工具.它的软件资料存 ...
- 分享基于EF+WCF的通用三层架构及解析
本项目结合EF 4.3及WCF实现了经典三层架构,各层面向接口,WCF实现SOA,Repository封装调用,在此基础上实现了WCFContext,动态服务调用及一个分页的实例. 1. 项目架构图: ...
- Vue.js示例:树型视图; 模式组件;
树型图 本示例是一个简单的树形视图实现,它展现了组件的递归使用. mycode pen:https://codepen.io/chentianwei411/pen/KGKQxE 重点:递归是如何形成的 ...
- p1468 Party Lamps
就是模拟.同一个开关按2下相当于没按,那么,如果一共按0下,就是没按,按1下就是4个开关的1个,按2下可能相当于实际按了0下或按2下,按3下实际按了1下或3下,之后如果是奇数,相当于按1或3下,偶数相 ...
- Django的form组件
forms组件 forms组件,是一个类.在视图函数中创建一个类,类需要继承forms.Form from django import forms 1.校验数据 步骤和语法: 1. 创建一个form ...
- python的索引问题
之前自己在python索引中一直遇到这样的问题: data = np.arange(12).reshape((3,4)) print(data[:][0]) 想要索引第一列时总是索引到第一行,后来发现 ...
- 利用phpqrcode二维码生成类库和imagecopymerge函数制拼接图片的经验
前期准备 引入phpqrcode类库(下载地址:https://sourceforge.net/projects/phpqrcode/) PHP开启GD扩展库支持 1.利用phpqrcode生成二维码 ...
- Alyona and a tree CodeForces - 739B (线段树合并)
大意: 给定有根树, 每个点$x$有权值$a_x$, 对于每个点$x$, 求出$x$子树内所有点$y$, 需要满足$dist(x,y)<=a_y$. 刚开始想错了, 直接打线段树合并了..... ...
- 『TensotFlow』RNN中文文本_下_暨研究生开学感想
承前 接上节代码『TensotFlow』RNN中文文本_上, import numpy as np import tensorflow as tf from collections import Co ...