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 }