【问题标题】:Exception when setting owner of a dialog window设置对话框窗口的所有者时出现异常
【发布时间】:2018-08-20 08:33:04
【问题描述】:

我有一个窗口,我在我的应用程序中用作登录对话框。这是我的 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 属性设置为自身。”

如果我放弃设置 window.Owner,窗口只会在主监视器上的随机位置打开。

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

这是引发的整个异常:

【问题讨论】:

  • 如果您没有所有者窗口,请使用 CenterScreen 作为 WindowStartupLocation
  • LoginDialogWindow 在您的情况下是 Application.Current.MainWindow
  • @GaurangDave 谢谢。是的,这让我明白了。研究如何从视图模型中获取 MainWindow...
  • @ASh 感谢您的提示。如果我无法解决这个问题,我会把它作为 B 计划。
  • 谢谢@Oystein!享受编码!

标签: c# wpf dialog window


【解决方案1】:

您收到此异常的原因是 LoginDialogWindow 在您的情况下是 Application.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 中,将与 Owner 相同的窗口设置为子窗口。

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多