能否重新显示已关闭的对话框窗口?

4

一些背景信息...我有一个System.Windows.Window,用于显示模态消息框。我创建了一个Show()方法,该方法初始化窗口的内容,然后调用ShowDialog()方法。用户在此窗口上单击按钮,会将有关已单击按钮的一些信息设置到Tag属性中,然后通过Close()关闭窗口。

正如预期的那样,当尝试在Window被关闭后调用ShowDialog()方法时,会出现ShowDialog异常。有没有办法重用同一个Window实例,这样每次需要消息框时就不必新建实例呢?

例如...

MessageBoxWindow mbw = new MessageBoxWindow();
result = mbw.Show("caption", "message 1");

mbw.Show("caption", "message 2");
// The above throws an exception, so I have to do this...
mbw = new MessageBoxWindow();
result = mbw.Show("caption", "message 2");

非常感谢您的帮助!

2个回答

2
使用 .Hide() 而不是 .Close()。这样可以将其移除而不破坏它。当需要时,您可以再次调用 Show()。
 MainWindow test = new MainWindow();
  test.Show();
  test.Hide();
  test.Show();

谢谢!非常简单的解决方案,适用于我需要解决的问题。 - geoffmazeroff

0

您可以添加一个FormClosing事件,以取消窗体关闭并将Form.Visible设置为false。然后,您还需要一个Show方法来检查此表单是否为空,这样您就会知道是否需要创建新表单或仅显示您已经拥有的表单。

例如:

private void FormMessageBox_FormClosing(object sender, FormClosingEventArgs e)
{
  //This stops the form from being disposed
  e.Cancel = true;
  this.Visible = false;
}

public static void Show(FormMessageBox formMessageBox, string message)
{
  //if formMessageBox is null we need to create a new one otherwise reuse.
  if (formMessageBox == null)
  {
    formMessageBox = new FormMessageBox(message);
    formMessageBox.ShowDialog();
  }
  else
  {
    formMessageBox.lblMessage.Text = message;
    formMessageBox.Visible = true;
  }
}

你可以使用Hide()和Show()方法来代替Visible,这种方法也建议在Jay的答案中使用。 - Jack
这个解决方案可能是使用与窗口相关的事件来解决问题最完整的方法。不幸的是,我的团队领导说消息框要与我们的IoC兼容,因此静态方法往往会有问题。如果IoC不在考虑范围内,我会使用这个解决方案。谢谢! - geoffmazeroff
如果只是静态方法(而不是事件处理程序)有问题,show方法就不必是静态的。我之所以将其设为静态的,只是因为我编写的方式允许它是静态的。可能是出于习惯吧。 - Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接