popup non topmost

来源:互联网 发布:网络童星公司 编辑:程序博客网 时间:2024/05/16 09:29
public class PopupNonTopmost : Popup    {        public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(            typeof(PopupNonTopmost),            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 PopupNonTopmost).UpdateWindow();        }        protected override void OnOpened(EventArgs e)        {            UpdateWindow();        }        private void UpdateWindow()        {            var hwnd = ((HwndSource)PresentationSource.FromVisual(this.Child)).Handle;            RECT rect;            if (GetWindowRect(hwnd, out rect))            {                SetWindowPos(hwnd, Topmost ? -1 : -2, rect.Left, rect.Top, (int)this.Width, (int)this.Height, 0);            }        }        #region P/Invoke imports & definitions        [StructLayout(LayoutKind.Sequential)]        public struct RECT        {            public int Left;            public int Top;            public int Right;            public int Bottom;        }        [DllImport("user32.dll")]        [return: MarshalAs(UnmanagedType.Bool)]        private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);        [DllImport("user32", EntryPoint = "SetWindowPos")]        private static extern int SetWindowPos(IntPtr hWnd, int hwndInsertAfter, int x, int y, int cx, int cy, int wFlags);        #endregion    }

  

0 0
原创粉丝点击