卓尔高考网

自定义WPF Popup控件

篇首语:本文由小编为大家整理,主要介绍了自定义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控件的主要内容,如果未能解决你的问题,请参考以下文章

您可能还会对下面的文章感兴趣: