C# 如何在关闭窗口之前只显示一次messagebox

C# 如何在关闭窗口之前只显示一次messagebox,c#,wpf,window,messagebox,termination,C#,Wpf,Window,Messagebox,Termination,我已经做了一个独立的应用程序,为研究目的做了一些工程分析。它是用来在另一个链接到主窗口的窗口(我不知道正确的词是什么,让我称之为子窗口)中显示显示结果的图形。为了提醒最终用户在关闭主窗口之前保存输入文件,我为通知添加了一个代码,如下所示: private void Window_Closing(object sender, CancelEventArgs e) { MessageBoxResult result = MessageBox.Show("Please

我已经做了一个独立的应用程序,为研究目的做了一些工程分析。它是用来在另一个链接到主窗口的窗口(我不知道正确的词是什么,让我称之为子窗口)中显示显示结果的图形。为了提醒最终用户在关闭主窗口之前保存输入文件,我为通知添加了一个代码,如下所示:

    private void Window_Closing(object sender, CancelEventArgs e)
    {
        MessageBoxResult result = MessageBox.Show("Please Be Sure That Input & Output Files Are Saved.  Do You Want To Close This Program?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Warning);
        if (result == MessageBoxResult.Yes)
        {
            Application.Current.Shutdown();
        }
        else
        {
            e.Cancel = true;
        }
    } 
XAML代码是:

<Window x:Class="GMGen.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Icon="Icon1.ico"
Title="GMGen" WindowState="Maximized" Closing="Window_Closing" >
<DockPanel x:Name="RootWindow">
    <ContentControl Content="{Binding CurrentPage}" />
    <Grid >
    </Grid >
</DockPanel>


当我关闭主窗口而不打开任何显示图形的子窗口时,它工作正常。弹出通知窗口并单击“是”,然后程序终止。然而,如果我在关闭主窗口之前打开并关闭子窗口,事情会变得有点奇怪。弹出通知。单击“是”,程序不会终止。相反,会弹出另一个通知。单击是,然后弹出另一个。这件事发生的时间和我打开和关闭子窗口的时间差不多。i、 e.如果我打开和关闭子窗口四次,通知会出现四到五次。我不知道是什么导致了这个问题。我只想显示messagebox一次。如果你知道解决办法,请告诉我。我真的很感谢你的帮助

您很可能订阅了每个窗口上的关闭事件,因为它触发了N次

在没有看到您的实际实现的情况下,很难说解决它的最佳选择是什么。这里有一种方法可以通过使用静态标志进行确认来处理它。一旦显示确认,该标志将阻止后续弹出

private static bool _isConfirmed = false;
private void Window_Closing(object sender, CancelEventArgs e)
{

    if (!_isConfirmed)
    {
        MessageBoxResult result = MessageBox.Show("Please Be Sure That Input & Output Files Are Saved.  Do You Want To Close This Program?", "Confirmation", MessageBoxButton.YesNo, MessageBoxImage.Warning);
        if (result == MessageBoxResult.Yes)
        {
            Application.Current.Shutdown();
        }
        else
        {
            e.Cancel = true;
        }
        _isConfirmed = true;
    }
}

听起来好像每次打开另一个窗口(或者每次关闭一个窗口)时,您都在订阅该活动。不幸的是,您没有发布好的代码示例(请参阅),因此我们无法看到您是如何管理windows的。但这种情况可能发生的一种方式是,在显示子窗口时隐藏主窗口,但在关闭子窗口后重新创建主窗口。您需要查看订阅事件(在*.g.cs文件中自动生成)的代码才能真正理解问题。您不需要Application.Current.Shutdown();,由于您在“关闭”抱歉,我没有把所有的代码。这是相当长的代码张贴在这里,我不知道从哪里开始编辑代码张贴。不管怎样,我只是用了你贴在这里的代码。它工作顺利。我非常感谢你的帮助,