自定义WPF Popup控件 admin 2023-05-24 10:45:01 篇首语:本文由小编为大家整理,主要介绍了自定义WPF Popup控件相关的知识,希望对你有一定的参考价值。 解决问题1、WPF Popup 不随着 Window 一起移动的问题2、WPF Popup 总是显示在最前面 引用命名空间 xmlns:ctrl="clr-namespace:Micro.UI.Controls" XAML C#using System;using System.Runtime.InteropServices;using System.Windows;using System.Windows.Controls;using System.Windows.Threading;using System.Windows.Interop;using System.Windows.Media;using System.Windows.Controls.Primitives;namespace Micro.UI.Controls public class uiPopup : Popup /// /// 是否窗口随动,默认为随动(true) /// public bool IsPositionUpdate get return (bool)GetValue(IsPositionUpdateProperty); set SetValue(IsPositionUpdateProperty, value); public static readonly DependencyProperty IsPositionUpdateProperty = DependencyProperty.Register("IsPositionUpdate", typeof(bool), typeof(uiPopup), new PropertyMetadata(true, new PropertyChangedCallback(IsPositionUpdateChanged))); private static void IsPositionUpdateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) (d as uiPopup).pup_Loaded(d as uiPopup, null); /// /// 加载窗口随动事件 /// public uiPopup() this.Loaded += pup_Loaded; /// /// 加载窗口随动事件 /// 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; /// /// 刷新位置 /// 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 uiPopup).UpdateWindow(); /// /// 重写拉开方法,置于非最前 /// /// protected override void OnOpened(EventArgs e) UpdateWindow(); /// /// 刷新Popup层级 /// 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 以上是关于自定义WPF Popup控件的主要内容,如果未能解决你的问题,请参考以下文章 Windows CMD findstr命令详解 cc.tween 动作系统详解 您可能还会对下面的文章感兴趣: 相关文章 浏览器打不开网址提示“ERR_CONNECTION_TIMED_OUT”错误代码的解决方法 如何安装ocx控件 VMware的虚拟机为啥ip地址老是自动变化 vbyone和EDP区别 linux/debian到底怎么重启和关机 苹果平板键盘被弄到上方去了,如何调回正常? 机器学习常用距离度量 如何查看kindle型号