zoukankan      html  css  js  c++  java
  • WPF PopupNonTopmost重写

    之前做WPF遇到问题,在网上找到的一个类

     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     }
  • 相关阅读:
    如何在TVM上集成Codegen(上)
    CodeGen准备存储库
    CodeGen按钮循环
    CodeGen标记循环
    CodeGen结构循环回路
    CodeGen处理Synergy方法目录
    回顾6 单点登录
    回顾 five 幂等性
    回顾 four Object
    程序员的数学基础课 笔记6
  • 原文地址:https://www.cnblogs.com/gaobing/p/3860392.html
Copyright © 2011-2022 走看看