我们如何设置Window的Owner为指定的Handle呢?这涉及一个win32交互的问题。
方法一:使用WindowInteropHelper
首先我们一般的常规做法是,重写窗体的OnSourceInitialized方法或者绑定SourceInitialized事件。在它们相关联的代码中面去处理。为什么在这里处理呢,因为窗体执行到这一步才能确定自己的Handle值。WindowInteropHelper取到的Handle值才有意义,否则就要使用EnsureHandle了。
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
var helper = new WindowInteropHelper(this);
helper.Owner=Process.GetCurrentProcess().MainWindowHandle;
}
方法二:HwndSource
this.Owner = (Window)HwndSource.FromHwnd(WindowHelper.RevitHandle)?.RootVisual;
注意:
如果窗体是通过ShowDialog进行显示,那么就不能再在OnSourceInitialized方法里设置Owner了,系运行时系统会报错。调整方案就是,在调用ShowDialog之前或者窗体构造函数里设置窗体的Owner