让WPF的Popup不总置顶的解决方案

摘要:
当使用WPF的弹出菜单时,您会发现一个问题。它将永远处于顶端。只要Popup的StayOpen未设置为False,它将始终保持在顶部并阻止其他窗口。解决方案是继承Popup并重新定义控件PopupEx-1:-2,rect.Left,rect.Top,this.Width,this.Height,0);}#regionimportsdefinitions[StructLayout]publicstructRECT{publicintLeft;publicintTop;publicintRight;publicintBottom;}[DllImport][return:MarshalAs]privatestaticexternboolGetWindowRect;[DllImport]privatestaticexternntSetWindowPos;#Endregion}然后在调用控件时设置PopupEx属性Toppost=False。还有一个弹出窗口问题。下一篇文章将给出“拖动时弹出窗口不会随父窗口移动”问题的解决方案。敬请期待。

使用WPF的Popup的时候会发现有一个问题,它总是会置顶,只要Popup的StayOpen不设置为False,它就一直呆在最顶端,挡住其他的窗口。

解决方案是继承Popup重新定义控件PopupEx。

public class PopupEx : Popup
    {
        public static DependencyProperty TopmostProperty = Window.TopmostProperty.AddOwner(typeof(PopupEx ), 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 PopupEx ).UpdateWindow();
        }
        protected override void OnOpened(EventArgs e)
        {
            UpdateWindow();
        }
        private void UpdateWindow()
        {
            var hwnd = ((HwndSource)PresentationSource.FromVisual(this).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 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
    }

然后在调用该控件的时候设置该PopupEx的属性 Topmost=False即可。

还有一个Popup的问题,“在父窗口拖动的时候Popup不随着父窗口移动”的问题的解决方案我会在下一篇随笔中给出,敬请期待。

转载时请注明文章来源http://www.cnblogs.com/Leaco/p/3164394.html

免责声明:文章转载自《让WPF的Popup不总置顶的解决方案》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android开发 GradientDrawable详解js怎么获取动态链式属性呢?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于ios中富文本编辑的解决方案

关于ios中富文本编辑的一个巧妙解决方案 项目中需要用到富文本的编辑功能,作为ios客户端富文本的编辑功能开发耗费是比较大的,现在有一种解决方案是:服务器端返回一个嵌有富文本编辑器的网 页,我们可以在富文本编辑器上边进行文本的编辑,然后就可以调用网页中保存富文本的接口,将编辑好的富文本插入到数据库中,这样便可以实现富文本编辑的功 能....

WPF中为窗体设置背景图片

在WPF应用程式中,我们往往想为一个窗体设置一个中意的背景图,而不是单独的为这个Background设置成某种颜色或渐变颜色的背景。 在WPF 利用Expression Blend工具如何达到这种效果呢?比如我们想做一个登陆窗体界面,界面效果如下图所示: 下面我就大概说下过程,首页建立一个工程为WpfLoginView,并在Expression Blen...

Wpf之Xaml属性值和特性值(一)

其实我一直很好奇在xaml中,通过Attribute=Value这种方式可以进行对元素的描述, 例如: <Rectangle Name=” rectangle” Fill=”Blue”/> 这是一个矩形,并且利用蓝色来填充。我们知道在wpf中给UI元素上色可以用Brush(画刷),在MSDN中得知Rectangle.Fill就是一个Brush类...

wpf 获取datagrid中模板中控件

//获取name为datagrid中第三列第一行模板的控件 FrameworkElement item = dataGrid.Columns[3].GetCellContent(dataGrid.Items[0]); DataGridTemplateColumn temp = dataGrid.Column...

【WPF】软件更新程序的设计思路

目标:客户端程序在启动时,自动联网检查服务端是否有新的版本,有则提示用户更新客户端。 思路: 1、打开Visual Studio,在主体程序的解决方案下再新建一个叫自动更新程序的项目。主体程序的目录是D:workspaceMyProjectClient,自动更新程序的目录是D:workspaceMyProjectUpdateTool。 2、最后打包出来时将...

WPF概述

Windows Presentation Foundation (简称WPF),是一个可创建适用于Windows的桌面客户端应用程序的UI框架。WPF框架支持广泛的应用程序开发功能,包括应用程序模型、空间、图形和数据绑定。WPF使用Extension Application Markup Language(XAML)为应用程序编程提供声明性模型。 WPF有...