设置对话框窗口所有者的例外

时间:2018-08-20 08:33:04

标签: c# wpf dialog window

我在应用程序中有一个用作登录对话框的窗口。这是我的MainWindow视图模型中的按钮处理程序:

private void LoginDialogButtonPressed(object obj)
{
    var vm = new LoginDialogWindowVM(Controller);
    var window = new LoginDialogWindow(vm);
    window.Owner = Application.Current.MainWindow;
    window.ShowDialog();
}

我的登录窗口设置为WindowStartupLocation="CenterOwner"。现在,这可以在Visual Studio的调试模式下正常工作。但是,在构建和运行发行版时,打开登录对话框会引发异常:“无法将Owner属性设置为其自身。”

如果我放弃设置窗口所有者,该窗口将在主监视器上的任意位置打开。

我在这里做错了什么?如何在不引发异常的情况下使登录窗口以MainWindow为中心打开?

这是引发的整个异常:

enter image description here

1 个答案:

答案 0 :(得分:2)

您为什么会遇到此异常的原因是LoginDialogWindowApplication.Current.MainWindow,而Application.Current.MainWindow没有返回MainWindow对象。

实现这一目标的方法之一是

Window作为CommandParameter从View传递到ViewModel。

 <Button Content="OK" Command="{Binding OKCommand}"
         CommandParameter="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>

在ViewModel中,将与“所有者”相同的窗口设置为子窗口。

private void LoginDialogButtonPressed(object obj)
{
    var vm = new LoginDialogWindowVM(Controller);
    var window = new LoginDialogWindow(vm);
    window.Owner = obj as Window;
    window.ShowDialog();
}

此处,参数object obj是从View传递的Window。