我有一个窗口,在我的应用程序中用作登录对话框。这是我的主窗口 View 模型中的按钮处理程序:
private void LoginDialogButtonPressed(object obj)
{
var vm = new LoginDialogWindowVM(Controller);
var window = new LoginDialogWindow(vm);
window.Owner = Application.Current.MainWindow;
window.ShowDialog();
}
我的登录窗口设置为 WindowStartupLocation="CenterOwner"
。现在,这在 Debug模式下的 Visual Studio 中运行良好。但是在构建和运行版本时,打开登录对话框会引发异常:“无法将所有者属性设置为自身。”
如果我放下设置 window.Owner,该窗口只会在主监视器上的随机位置打开。
我在这里做错了什么?如何让登录窗口以 MainWindow 为中心打开而不抛出异常?
下面是抛出的整个异常:
最佳答案
你得到这个异常的原因是 LoginDialogWindow
在你的情况下是 Application.Current.MainWindow
而 Application.Current.MainWindow
不是t 返回 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
关于c# - 设置对话框窗口的所有者时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51926870/