2010-07-23 67 views
4

这里有一些上下文...我有一个System.Windows.Window用于显示模态消息框。我创建了一个Show()方法来初始化窗口的内容,然后调用ShowDialog()。用户单击此窗口上的一个按钮,有关点击按钮的一些信息在Tag属性中设置,然后窗口通过Close()关闭。是否可以重新显示并关闭对话窗口?

正如所料,当试图在窗口关闭后调用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

使用.Hide()代替.Close()。这不会破坏它。然后你可以在需要时再次调用Show()。

MainWindow test = new MainWindow(); 
    test.Show(); 
    test.Hide(); 
    test.Show(); 
+0

谢谢!非常简单的解决方案,适用于我需要解决的问题。 – geoffmazeroff 2010-07-25 17:08:51

0

您可以添加一个FormClosing事件来取消窗体关闭,而是将Form.Visible设置为false。那么你还需要Show方法来检查这个Form是否为null,所以你会知道你是否需要创建一个新的Form或者只显示一个你已经拥有的Form。

例如:

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; 
    } 
} 
+0

这个解决方案可能是使用与窗口有关的事件来解决问题的最完整的方法,而不是使用Visible,您可以使用此方法的Hide()和Show()方法以及Jay的答案中提出的 – Jack 2010-07-23 14:14:19

+0

。不幸的是,我的团队负责人说消息框与我们的Io​​C兼容,因此静态方法往往是有问题的。如果IoC不在图片中,我会使用这个解决方案。谢谢! – geoffmazeroff 2010-07-25 17:13:18

+0

如果它只是静态方法(而不是事件处理程序),那么show方法不一定是静态的。我只是把它变成静态的,因为我写它的方式允许它是静态的。我猜想习惯的力量。 – Jack 2010-07-26 04:04:44

相关问题