WPF PopupNonTopmost書き換え

8032 ワード

前にWPFをして問題にぶつかって、ネット上で見つけた1つのクラス
 1     public class PopupNonTopmost : System.Windows.Controls.Primitives.Popup

 2     {

 3         public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(

 4         typeof(PopupNonTopmost),

 5         new FrameworkPropertyMetadata(false, OnTopmostChanged));

 6 

 7         public bool Topmost

 8         {

 9             get { return (bool)GetValue(TopmostProperty); }

10             set { SetValue(TopmostProperty, value); }

11         }

12 

13         private static void OnTopmostChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)

14         {

15             (obj as PopupNonTopmost).UpdateWindow();

16         }

17 

18         protected override void OnOpened(EventArgs e)

19         {

20             UpdateWindow();

21         }

22 

23         private void UpdateWindow()

24         {

25             var hwnd = ((HwndSource)PresentationSource.FromVisual(this.Child)).Handle;

26             RECT rect;

27 

28             if (GetWindowRect(hwnd, out rect))

29             {

30                 SetWindowPos(hwnd, Topmost ? -1 : -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0);

31             }

32         }

33 

34         #region P/Invoke imports & definitions

35 

36         [StructLayout(LayoutKind.Sequential)]

37         public struct RECT

38         {

39             public int Left;

40             public int Top;

41             public int Right;

42             public int Bottom;

43         }

44 

45         [DllImport("user32.dll")]

46         [return: MarshalAs(UnmanagedType.Bool)]

47         private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);

48 

49         [DllImport("user32", EntryPoint = "SetWindowPos")]

50         private static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags);

51 

52         #endregion

53     }