WPF Popup 置顶问题

原文 WPF Popup 置顶问题

问题:

使用wpf的popup,当在popup中弹出MessageBox或者打开对话框的时候,popup总是置顶,并遮住MessageBox或对话框.

解决:

写如下用户控件

 

需导入的空间: using System.Windows.Controls.Primitives;

    using System.Runtime.InteropServices;

    using System.Windows.Interop;

 

 

[c-sharp]  view plain copy
 
  1. public class CCPopup : Popup  
  2.     {  
  3.         public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(typeof(CCPopup), new FrameworkPropertyMetadata(false, OnTopmostChanged));  
  4.         public bool Topmost  
  5.         {  
  6.             get { return (bool)GetValue(TopmostProperty); }  
  7.             set { SetValue(TopmostProperty, value); }  
  8.         }  
  9.         private static void OnTopmostChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)  
  10.         {  
  11.             (obj as CCPopup).UpdateWindow();  
  12.         }  
  13.         protected override void OnOpened(EventArgs e)  
  14.         {  
  15.             UpdateWindow();  
  16.         }  
  17.         private void UpdateWindow()  
  18.         {  
  19.             var hwnd = ((HwndSource)PresentationSource.FromVisual(this.Child)).Handle;  
  20.             RECT rect;  
  21.             if (GetWindowRect(hwnd, out rect))  
  22.             {  
  23.                 SetWindowPos(hwnd, Topmost ? -1 : -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0);  
  24.             }  
  25.         }  
  26.         #region P/Invoke imports & definitions  
  27.         [StructLayout(LayoutKind.Sequential)]  
  28.         public struct RECT  
  29.         {  
  30.             public int Left;  
  31.             public int Top;  
  32.             public int Right;  
  33.             public int Bottom;  
  34.         }  
  35.         [DllImport("user32.dll")]  
  36.         [return: MarshalAs(UnmanagedType.Bool)]  
  37.         private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);  
  38.         [DllImport("user32", EntryPoint = "SetWindowPos")]  
  39.         private static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags);  
  40.         #endregion  
  41.     }  

 

你可能感兴趣的:(WPF)