如何检测Window已经用完了“ShowDialog”调用

在WPF中,您只需在窗口上调用一次ShowDialog 。 之后就完成了。

对我来说似乎有些蹩脚,但这些都是规则。 如果再次调用ShowDialog ,则会出现以下exception:

窗口关闭后无法设置可见性或调用Show,ShowDialog或WindowInteropHelper.EnsureHandle

我想知道的是:我怎么能拿一个Window (或UserControl真的)并检查它是否已经调用ShowDialog (所以我知道在再次调用ShowDialog之前new一个不同的)。

像这样的东西:

 public void ShowListOfClients() { // | This is the method I want to write // V RefreshViewIfNeeded(_myWindowOrUserControlThatShowsAList); FillWindowWithBusinessData(_myWindowOrUserControlThatShowsAList); _myWindowOrUserControlThatShowsAList.ShowDialog(); } 

注意:显然在上面的例子中,每次进入方法时创建一个新的WindowOrUserControlThatShowsAList会更容易。 但请更多地考虑这个愚蠢的例子。

这不是ShowDialog()独有的,Show()也是如此。 不,没有IsDisposed属性可供检查。 IsLoaded只是解决方案的一半,对于第一次调用也是错误的。

第一种方法是只创建一个可以重新显示的对话框:

  public bool CloseAllowed { get; set; } private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (!CloseAllowed) { this.Visibility = System.Windows.Visibility.Hidden; e.Cancel = true; } } 

下一个是明确跟踪对象引用的运行状况:

  private Window1 win = new Window1(); // say private void button1_Click(object sender, RoutedEventArgs e) { if (win == null) { win = new Window1(); win.Closing += delegate { win = null; }; } win.ShowDialog(); } 

那么脏的方法是抓住exception。

干净的方法是显示一个带有ShowDialog的窗口,并在函数返回时销毁(丢失引用等)窗口。 视图不应与模型紧密耦合(您正在使用MVVM吗?)因此,为每个客户端视图创建新的可视对象应该不是问题。

处理此问题的简单方法,而不会搞乱Closing事件:

 public partial class MainWindow { private SomeCustomWindow _someCustomWindow; public MainWindow() { InitializeComponent(); } private void OnOpenCustomWindowButtonClick(object sender, RoutedEventArgs e) { if (_someCustomWindow != null) _someCustomWindow.Close(); _someCustomWindow = new SomeCustomWindow(); _someCustomWindow.ShowDialog(); } private void OnWindowClosing(object sender, CancelEventArgs e) { if (_someCustomWindow!= null) _someCustomWindow.Close(); } }