我定义了一个View作为SubWindow类的实例,其定义如下
public partial class SubWindow : Window
{
public SubWindow(BaseViewModel vm)
{
InitializeComponent();
this.Loaded += OnLoaded;
vm.CloseWindow += (s, e) => this.Close();
vm.Hide += (s, e) => this.Hide();
this.Content = vm;
this.DataContext = vm;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
BaseViewModel vm = DataContext as BaseViewModel;
if (vm != null)
{
vm.OnInitDialog()
}
}
}
这是我的ViewModel基类
public class BaseViewModel() // implements INotifyPropertyChanged
{
public event EventHandler CloseWindow;
public virtual bool OnInitDialog()
{
}
public virtual void OnCancel(object param)
{
CloseWindow(null, null);
}
}
然后是我的具体ViewModel类
public class MyViewModel : BaseViewModel
{
public MyViewModel()
{
// Init ViewModels
}
public bool OnInitDialog()
{
if(check())
{
OnCancel(null);
return false;
}
return true;
}
}
这是我显示窗口的方式
MyViewModel vm = new MyViewModel();
Window window = new SubWindow(vm);
window.ShowDialog();
加载窗口时,会引发OnLoaded事件。
在OnLoaded事件内部,它将调用ViewModel的OnInitDialog方法。
问题出在OnInitDialog()内部,如果check()返回true,则将调用OnCancel(),后者又调用ViewModel的CloseWindow()和View的Close()。
换句话说,Window的Close()在其ShowDialog()内部被调用,在我看来这不是一个好习惯。
有时,如果该解决方案以发布模式构建,则会引发异常。
所以我的问题是如何在加载窗口后停止渲染窗口。