我在应用程序中有一个用作登录对话框的窗口。这是我的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为中心打开?
这是引发的整个异常:
答案 0 :(得分:2)
您为什么会遇到此异常的原因是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中,将与“所有者”相同的窗口设置为子窗口。
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。