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特效.效果图如下: 在线预览 源码 ...
随机推荐
- docker下debian镜像开启ssh, 允许root用密码登录
用的官方python镜像做开发, 暴露端口, 用pycharm ssh进去开发. 忽然发现本来ssh能连上, 但是更了新的python镜像连不上了. 有折腾了一下, 连上了. 主要是python官网镜 ...
- python paramiko 模块简单介绍
背景,公司的很多服务包括数据库访问都需要通过跳板机访问,为日常工作及使用带来了麻烦,特别数python直接操作数据更是麻烦了,所以一直想实现python 通过跳板机访问数据库的操作. 首先了解到了 p ...
- (转)C# 单例模式
文章1: 一.多线程不安全方式实现 public sealed class SingleInstance { private static SingleInstance inst ...
- 初步了解hg19注释文件的内容 | gtf
hg19有哪些染色体? chr1 chr2 chr3 chr4 chr5 chr6 chr7 chr8 chr9 chr10 chr11 chr12 chr13 chr14 chr15 chr16 c ...
- CentOS7 下源代码安装php7
安装PHP7: php-7.1.2.tar.gz:下载:wget http://cn2.php.net/get/php-7.1.2.tar.gz/from/this/mirror 安装php: # t ...
- 通俗大白话来理解TCP协议的三次握手和四次断开
from : https://blog.csdn.net/Neo233/article/details/72866230?locationNum=15&fps=1%20HTTP%E6%8F%A ...
- Educational Codeforces Round 48 (Rated for Div. 2)G. Appropriate Team
题意:求满足条件的(i,j)对数:\(gcd(v,a_i)=x,lcm(v,a_j)=y\) 题解:\(x|a_i,a_j|y\),\(x|y\),考虑质因子p,假设a_i中p次数为a,x中次数为b, ...
- spring boot 多数据源配置与使用
在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文 ...
- 【MySQL】【1】表中存在重复记录,删除保留其中一条
--删除题库(TABLE_Q )中,标题(TITLE )和类型(TYPE )都相同的数据,仅保留ID最小的一条 DELETE TABLE_Q FROM TABLE_Q, ( ) T2 WHERE TA ...
- 四则运算web最终版
经过若干时间的奋战,终于完成了web版四则运算程序.团队成员:井小普.张贺. 设计思想: 在之前的程序基础上两人结合开发web系统. 首先,进行登录注册界面的编写,不同用户,对应不同的错题库,答题记录 ...