原文地址:http://www.mgenware.com/blog/?p=339

WPF中的Windows的ShowDialog方法并没有提供设置Owner的参数,开发者需要在ShowDialog前设置好Window的Owner属性,正因为如此,许多时候你可能就忘了设置Owner,直接把对话框显示出去了。这样显示的对话框看似没有问题,但是当用户在任务栏切换窗体或者切换至程序时,对话框会显示在主窗体后面,而此时主窗体是不可点的!如果主窗体可以覆盖整个对话框(通常是这样的),那么此时用户将会无法操作整个程序,这个问题在另一篇文章里仔细讨论过。

写了个辅助类型会自动设置Owner然后再调用ShowDialog方法,当然自动设置的Owner就是Windows的当前窗体,通过GetForegroundWindow API获取当前窗体的句柄,然后将其转换成WPF的Window对象。

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());

【转】WPF: 自动设置Owner的ShowDialog 适用于MVVM的更多相关文章

  1. WPF: 自动设置Owner的ShowDialog 适用于MVVM

    原文:WPF: 自动设置Owner的ShowDialog 适用于MVVM 原文地址:http://www.mgenware.com/blog/?p=339 WPF中的Windows的ShowDialo ...

  2. C#-WinForm-打开其他窗体的三种方式-Show()、设置Owner()、ShowDialog()

    打开其他窗体的三种方式 Show - 例如登入界面进入主页面,直接将主页面展示出来,两个窗体互不影响 public partial class Form1 : Form { public Form1( ...

  3. .Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用

    什么是GeneralUpdate: GeneralUpdate是基于.net framwork4.5.2开发的一款(c/s应用)自动升级程序. 第一个版本叫Autoupdate(原博客: WPF自动更 ...

  4. PowerShell脚本自动设置安卓手机wifi代理

    在实际测试工作中,经常要将安卓手机通过wifi代理的形式连接到本机的fiddler或charles服务器代理进行抓包测试.最近一直在想,有没有什么方法可以自动设置安卓手机的wifi代理,曾经想通过修改 ...

  5. 如何将ASP.NET MVC所有参数均自动设置为默认

    今天看到CSDN上有个问题觉得有点意思:"可不可以ASP.NET MVC所有参数均自动设置为默认" public class HomeController : Controller ...

  6. WPF后台设置xaml控件的样式System.Windows.Style

    WPF后台设置xaml控件的样式System.Windows.Style 摘-自 :感谢 作者: IT小兵   http://3w.suchso.com/projecteac-tual/wpf-zhi ...

  7. 使用批处理文件,自动设置计算机IP地址

    WIN7批处理设置IP地址不成功,显示“The filename, directory name, or volume label syntax is incorrect.”错误, 解决方法:将“本地 ...

  8. 自动设置iframe大小的jQuery代码

    自动设置iframe的宽度,如何用jquery来实现呢? 代码: <iframe src="main_folder.aspx" class="global_main ...

  9. 将非WPF window设为 WPF Window的Owner

    如果WPF Content是寄宿在Win32 窗体或Windows Form中,则在WPF模块中可能不会存在WPF Window(WPF模块的根可能是个UserControl).如果在WPF模块中弹出 ...

随机推荐

  1. JSTL标签库

    JSP页面作为内嵌java的Html简化了Servlet在控制页面显示的语法,但JSP脚本中的表达式功能不够强大,语法也稍显繁杂,EL(Expression Language)表达式语言的出现能够大大 ...

  2. BZOJ 2152 & 点分治

    Description: 只是打法法塔前测试一下板子 Code: /*================================= # Created time: 2016-04-20 14:3 ...

  3. Windows中使用TortoiseGit提交项目到GitLab配置

    下文来给各位介绍Windows中使用TortoiseGit提交项目到GitLab配置过程,下在全部图片希望对各位带来方便面. Gitlab默认的配置推荐使用shell命令行与server端进行交互,作 ...

  4. 【BZOJ2442】 [Usaco2011 Open]修剪草坪 斜率优化DP

    第一次斜率优化. 大致有两种思路: 1.f[i]表示第i个不选的最优情况(最小损失和)f[i]=f[j]+e[i] 显然n^2会T,但是可以发现f的移动情况可以用之前单调队列优化,就优化成O(n)的了 ...

  5. 【ORACLE】字符串操作 B字符串时A的一部分

    select * from a where instr(a,b)>0;用于实现B字段是A字段中的某一部分的时候,要论顺序或者要相邻的字符. 如果想要不论顺序或者不相邻的字符时,定义函数可以实现: ...

  6. java分享第十七天-03(封装操作mysql类)

     JAVA操作mysql所需jar包:mysql-connector-java.jar代码: import java.sql.*; import java.util.ArrayList; import ...

  7. 基于webdriver的jmeter性能测试-Selenium IDE

    前言: 由于某些项目使用了WebGL技术,需要高版本的Firefox和Chrome浏览器才能支持浏览,兼容性很弱,导致Loadrunner和jmeter(badboy)无法正常进行录制脚本.因此我们采 ...

  8. MySQL流程函数

    #如果value是真,返回t:否则返回f if(value,t f) #如果value1不为空,返回value1,否则返回value2 ifnull(value1,value2) #如果value1是 ...

  9. C代码实现数组

    直接上代码,没有什么说的 # include <stdio.h> # include <malloc.h> # include <stdlib.h> //用C实现数 ...

  10. toroiseSVN 无法连接服务器,提示unable connect to ……url 参数错误

    之前使用的好好的,有天突然提示无法连接repository url,能ping通服务器,就是一直报错,找了很多方法,如: 1.删除缓存及缓存文件 2.删除软件并重新安装 3.关闭windows防火墙 ...