WPF: 自动设置Owner的ShowDialog
来源:互联网 发布:怎么回复淘宝手机提问 编辑:程序博客网 时间:2024/06/04 18:11
WPF中的Windows的ShowDialog方法并没有提供设置Owner的参数,开发者需要在ShowDialog前设置好Window的Owner属性,正因为如此,许多时候你可能就忘了设置Owner,直接把对话框显示出去了。这样显示的对话框看似没有问题,但是当用户在任务栏切换窗体或者切换至程序时,对话框会显示在主窗体后面,而此时主窗体是不可点的!如果主窗体可以覆盖整个对话框(通常是这样的),那么此时用户将会无法操作整个程序,这个问题在另一篇文章里仔细讨论过(WPF:更好得理解对话框和ShowDialog方法)。
写了个辅助类型会自动设置Owner然后再调用ShowDialog方法,当然自动设置的Owner就是Windows的当前窗体,通过GetForegroundWindow API获取当前窗体的句柄,然后将其转换成WPF的Window对象。
代码:
//+ using System.Runtime.InteropServices;//+ using System.Windows.Interop;class DialogHelper{ //从Handle中获取Window对象 static Window GetWindowFromHwnd(IntPtr hwnd) { return (Window)HwndSource.FromHwnd(hwnd).RootVisual; } //GetForegroundWindow API [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); //调用GetForegroundWindow然后调用GetWindowFromHwnd static Window GetTopWindow() { var hwnd = GetForegroundWindow(); if (hwnd == null) return null; return GetWindowFromHwnd(hwnd); } //显示对话框并自动设置Owner public static void ShowDialog(Window win) { win.Owner = GetTopWindow(); win.ShowInTaskbar = false; win.ShowDialog(); }}
最后直接调用ShowDialog静态方法就可以了!
DialogHelper.ShowDialog(new MainWindow());
有任何疑问,可以到Coldfunction来提问.
Read 3 comments
0 0
- WPF: 自动设置Owner的ShowDialog
- WPF: 自动设置Owner的ShowDialog
- [WPF]如何实现设置弹出窗口的Owner属性功能?
- [WPF]如何实现设置UserControl 弹出窗口的Owner属性功能
- wpf App Startup中执行Showdialog后自动退出
- C# 非模式窗体show()和模式窗体showdialog()的区别及Owner属性的理
- C# 非模式窗体show()和模式窗体showdialog()的区别及Owner属性的理解
- 设置Owner属性的三种方式 --- Owner
- WPF 用ShowDialog的方法显示窗口的返回值
- Custom ShowDialog() method for WPF
- Messagebox的Owner,显示位置,自动关闭的研究。
- WPF用ShowDialog()弹出窗体时控制该窗体的显示位置,并传值回父窗体
- 处理非window设置为window的Owner
- C# showdialog(this) 与showdialog()的区别
- WPF中的ShowDialog方法与Show方法
- wpf 倒影的设置
- 在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件
- 在WPF里面获取右键弹出菜单(ContextMenu)的鼠标点击源(Owner)控件
- 数据库分库分表(sharding)系列(二) 全局主键生成策略
- Java内部类详解
- Xcode设置苹果应用的app icon和launch image(应用图标和启动页面)
- TCP连接的建立(三次握手)和释放(四次握手)
- NIO 与 IO
- WPF: 自动设置Owner的ShowDialog
- 机房收费系统—MDI窗体与子窗体
- 理解机器学习
- MongoDB Sharding学习理论篇
- 数据库分库分表(sharding)系列(三) 关于使用框架还是自主开发以及sharding实现层面的考量
- UITableView-FDTemplateLayoutCell缓存cell高度时,cell重叠高度为0的问题解决
- 安装apk到手机里
- Xwiki8.2.1遇到的安装问题
- 远控开发记录05_文件目录
//這樣如何?
//显示对话框并自动设置Owner
public static void ShowDialog(Window win)
{
win.Owner = Application.Current.MainWindow();
win.ShowInTaskbar = false;
win.ShowDialog();
}
父窗体不一定总是主窗体,比如“选项”窗体中弹出一个“编辑用户”的对话框,对话框的Owner是“选项”窗体而不是主窗体。