WPF 实现Popup不在最上层显示、随窗口移动

文章目录

  • 前言
  • 一、定义类继承Popup类
  • 二、使用
    • 1.在XAML头部加入链接
    • 2. 在XAML文件使用
  • 总结


前言

由于WPF 默认的Popup总是显示在所有窗口的前面,如何让popup 层只显示在该父级之上,并随着父级而动呢?下面来看实现。


一、定义类继承Popup类

public class PopupEx : Popup
{/// <summary>  /// 是否窗口随动,默认为随动(true)  /// </summary>  public bool IsPositionUpdate{get { return (bool)GetValue(IsPositionUpdateProperty); }set { SetValue(IsPositionUpdateProperty, value); }}public static readonly DependencyProperty IsPositionUpdateProperty =DependencyProperty.Register("IsPositionUpdate", typeof(bool), typeof(PopupEx), new PropertyMetadata(true, new PropertyChangedCallback(IsPositionUpdateChanged)));private static void IsPositionUpdateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){(d as PopupEx).pup_Loaded(d as PopupEx, null);}/// <summary>  /// 加载窗口随动事件  /// </summary>  public PopupEx(){this.Loaded += pup_Loaded;}/// <summary>  /// 加载窗口随动事件  /// </summary>  private void pup_Loaded(object sender, RoutedEventArgs e){Popup pup = sender as Popup;var win = VisualTreeHelper.GetParent(pup);while (win != null && (win as Window) == null){win = VisualTreeHelper.GetParent(win);}if ((win as Window) != null){(win as Window).LocationChanged -= PositionChanged;(win as Window).SizeChanged -= PositionChanged;if (IsPositionUpdate){(win as Window).LocationChanged += PositionChanged;(win as Window).SizeChanged += PositionChanged;}}}/// <summary>  /// 刷新位置  /// </summary>  private void PositionChanged(object sender, EventArgs e){try{var method = typeof(Popup).GetMethod("UpdatePosition", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);if (this.IsOpen){method.Invoke(this, null);}}catch{return;}}//是否最前默认为非最前(false)  public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(typeof(Popup), new FrameworkPropertyMetadata(false, OnTopmostChanged));public bool Topmost{get { return (bool)GetValue(TopmostProperty); }set { SetValue(TopmostProperty, value); }}private static void OnTopmostChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e){(obj as PopupEx).UpdateWindow();}/// <summary>  /// 重写拉开方法,置于非最前  /// </summary>  /// <param name="e"></param>  protected override void OnOpened(EventArgs e){UpdateWindow();}/// <summary>  /// 刷新Popup层级  /// </summary>  private void UpdateWindow(){var hwnd = ((HwndSource)PresentationSource.FromVisual(this.Child)).Handle;RECT rect;if (NativeMethods.GetWindowRect(hwnd, out rect)){NativeMethods.SetWindowPos(hwnd, Topmost ? -1 : -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0);}}[StructLayout(LayoutKind.Sequential)]public struct RECT{public int Left;public int Top;public int Right;public int Bottom;}#region P/Invoke imports & definitions  public static class NativeMethods{[DllImport("user32.dll")][return: MarshalAs(UnmanagedType.Bool)]internal static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);[DllImport("user32", EntryPoint = "SetWindowPos")]internal static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags);}#endregion
}

二、使用

1.在XAML头部加入链接

 xmlns:Component="clr-namespace:ZzgkChatRoom.Component"

2. 在XAML文件使用

代码如下(示例):

  <Buttonx:Name="EmojiBtn"Grid.Column="0"Margin="0,0,0,0"HorizontalAlignment="Left"VerticalAlignment="Center"Click="EmojiBtn_Click"Content="0 2 0 0"Style="{StaticResource ChatBottomBtn}"Tag="{x:Static Icon:PackIconVaadinIconsKind.SmileyOutline}" /><Component:PopupExx:Name="EmojiPop"AllowsTransparency="True"HorizontalOffset="-40"IsOpen="False"Placement="Top"PlacementTarget="{Binding ElementName=EmojiBtn}"VerticalOffset="-5"><BorderWidth="400"Height="200"Background="#ffffff"BorderBrush="#646465"BorderThickness="1"CornerRadius="3" /></Component:PopupEx>

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/612475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OceanBase原生分布式数据库

1.历史背景 在Java Web项目中&#xff0c;常常使用免费开源的MySQL数据库存储业务数据&#xff0c;按业界经验MySQL单库超过多大数据体量&#xff0c;或单表超过几百万条数据后就会出现查询变慢的情况&#xff0c;单实例数据库只能扩展物理资源(CPU、内存)&#xff0c;来提升查…

vivado 工程管理

管理项目 打开项目 当项目打开时&#xff0c;Vivado IDE会从项目已关闭。项目状态包括当前源文件顺序、已禁用和已启用 源文件、活动约束文件和目标约束文件&#xff0c;以及合成、模拟和实现运行。要打开项目&#xff0c;请使用以下方法之一&#xff1a; •在“入门”页面…

麦芯(MachCore)开发教程1 --- 设备软件中间件

黄国强 2024/1/10 acloud163.com 对任何公司来说&#xff0c;在短时间内开发一款高质量设备专用软件&#xff0c;是一件不太容易做到的事情。麦芯是笔者发明的一款设备软件中间件产品。麦芯致力于给设备厂商提供一个开发工具和平台&#xff0c;让客户快速高效的开发自己的设备专…

异构图 神经网络xFraud :Explaniable Fraud transcation detection

适用于异构图 2. 使用图进行异常检测 https://github.com/safe-graph/graph-fraud-detection-papers

01.大型语言模型背后的基本概念的高级解释 (LLMs)

像 ChatGPT 这样的大型语言模型 (LLMs) 是过去几年开发的深度神经网络模型。他们开创了自然语言处理(NLP)的新时代。在大型语言模型出现之前,传统方法擅长分类任务,例如垃圾邮件分类和简单的模式识别,这些任务可以通过手工制定的规则或更简单的模型来捕获。然而,它们通…

Android 通知简介

Android 通知简介 1. 基本通知 图1: 基本通知详情 小图标 : 必须提供,通过 setSmallIcon( ) 进行设置.应用名称 : 由系统提供.时间戳 : 由系统提供,也可隐藏时间.大图标(可选) : 可选内容(通常仅用于联系人照片,请勿将其用于应用图标),通过setLargeIcon( ) 进行设置.标题 : 可选…

浅谈 Android焦点管理机制 事件分发机制

什么是焦点 焦点能够让 视图和窗口 可以接受和处理 按键事件和导航事件 。在 Android 中&#xff0c;按键事件和导航事件通常指的是 与物理按键和输入设备&#xff08;如键盘、遥控器、游戏手柄等&#xff09;相关的交互事件 。 焦点的处理对于非触摸屏设备&#xff08;如电视…

【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

2024-1-11 文章目录 [2645. 构造有效字符串的最少插入数](https://leetcode.cn/problems/minimum-additions-to-make-valid-string/)方法一&#xff1a;计算组数方法二&#xff1a;动态规划方法三: 考虑相邻字母 2645. 构造有效字符串的最少插入数 方法一&#xff1a;计算组数 …

uniapp中实现H5录音和上传、实时语音识别(兼容App小程序)和波形可视化

文章目录 Recorder-UniCore插件特性集成到项目中调用录音上传录音ASR语音识别 在uniapp中使用Recorder-UniCore插件可以实现跨平台录音功能&#xff0c;uniapp自带的recorderManager接口不支持H5、录音格式和实时回调onFrameRecorded兼容性不好&#xff0c;用Recorder插件可避免…

Leetcode 416 分割等和子集

题意理解&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 即将数组的元素分成两组&#xff0c;每组数值sum(nums)/2 若能分成这样的两组&#xff0c;则返回true,否则返回false 本质上…

RobotStudio机器人码垛课程设计

一、任务需求 1、创建动态夹具&#xff08;600*400*50&#xff09; 2、创建物料&#xff08;600*400*200&#xff09; 3、起码按顺序码垛放置 4 个不同位置 二、软件常用操作及其快捷键 &#xff08;推荐自己按这些步骤操作一下&#xff0c;能明白这些操作的具体意义&#…

Java版直播商城:电商源码、小程序、三级分销及 免 费 搭 建 方案

一、技术选型 java开发语言&#xff1a;java是一种跨平台的编程语言&#xff0c;适用于大型企业级应用开发。使用java开发直播商城可以保证系统的稳定性和可扩展性。 spring boot框架&#xff1a;spring boot是一个快速构建spring应用的框架&#xff0c;简化了开发过程&#xf…

c# 动态更新配置文件

在.Net Framework版本可以使用ConfigurationManager 通常是指app.config或web.config 命名空间 System.Configuration下的ConfigurationManagerprivate void UpdateConfig(string key,string value) {Configuration config ConfigurationManager.OpenExeConfiguration(Config…

[渗透测试学习] Clicker - HackTheBox

文章目录 信息搜集代码审计反弹shell提权 信息搜集 nmap扫描一下端口 nmap -sV -sC -v -p- --min-rate 1000 10.10.11.232扫描结果 22/tcp open ssh 80/tcp open http Apache httpd 2.4.52 ((Ubuntu)) //重定向 111/tcp open rpcbind 2-4 (RPC #100000)我们往…

如何查看Ubuntu内存的使用情况

在Linux系统中&#xff0c;了解内存使用情况对于系统管理和性能优化非常重要。以下是一些常用的命令&#xff0c;以及它们的详细使用说明&#xff1a; 1. free 命令 用途: free 命令用于显示系统中空闲和已用的物理内存及交换内存。示例: 输入命令: free -m输出解释: 这将以M…

python 爬虫 request get或post传参

爬虫传参 import requestsurl http://www.xxx# get 或 post 传参数据 data {"pageNo": 1652,"pageSize": 10, }headers {Cookie: ,Host: ,Origin: ,Referer: ,User-Agent: , }# get 请求 # res requests.get( # url, # paramsdata, # hea…

重磅消息:2024北京国际智能科技展览会(世亚智博会)官宣定档

在数字新时代的浪潮下&#xff0c;智能科技作为推动社会进步的重要力量&#xff0c;正在以前所未有的速度改变着我们的生活和工作方式。为了进一步推动智能科技的发展和交流&#xff0c;2024北京国际智能科技展览会&#xff08;简称世亚智博会&#xff09;将于2024年6月份在北京…

[C#]winform使用纯opencvsharp部署yolox-onnx模型

【官方框架地址】 https://github.com/Megvii-BaseDetection/YOLOX 【算法介绍】 YOLOX是一个高性能的目标检测算法&#xff0c;它是基于YOLO&#xff08;You Only Look Once&#xff09;系列算法的Anchor Free版本。YOLOX由Megvii Technology的研究团队开发&#xff0c;并在…

linux—多服务免密登录

文档结构 概念简介配置操作 概念简介 配置操作 场景&#xff1a;在部署gp集群时&#xff0c;希望 master 节点可以使用gpadmin用户可以实现免密登录 slave1和 slave2 节点&#xff1b; step_1: IP映射 xx.xx.xx.101 server-slave1 xx.xx.xx.102 server-slave2说明&#x…

使用Spring Boot集成中间件:基础篇

使用Spring Boot集成中间件&#xff1a;Redis基础讲解 在现代应用开发中&#xff0c;中间件在构建高效、可扩展的系统方面起着至关重要的作用。而Spring Boot作为一种快速开发框架&#xff0c;提供了丰富的集成中间件的能力&#xff0c;使得我们能够轻松地将各种中间件引入到我…