【问题标题】:Run code before exiting a C# window application在退出 C# 窗口应用程序之前运行代码
【发布时间】:2018-05-11 03:45:19
【问题描述】:

我是 C# 开发的新手,我正在尝试在用户完全退出应用程序之前运行一些代码。我试图在网上查看,但没有得到任何东西。这是我的代码,它不起作用。谢谢:

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            Console.WriteLine("Hello World!");

        }

        void DataWindow_Closing(object sender, CancelEventArgs e)
        {
            Console.WriteLine("Goodbey World!");
        }
    }
}

【问题讨论】:

  • 你的意思是你的“再见世界!”是不是正在写?顺便说一句,如果它的 Windows 应用程序,你应该把它放在 MessageBox 中。我希望这个DataWindow_Closing 事件被MainWindow 的结束事件订阅。
  • 这不是悖论吗?谁会赢,最强壮的人还是最重的石头? DoBeforeQuit() 或 QuitBeforeContinue() 的计算机科学领域也是如此,谁将获胜
  • 您预计会发生什么?如果将其发送到控制台,则不会阻止控制台在最后退出,因此 goodbey (sic) 消息将仅显示一毫秒。
  • @andrew 有道理。你试过在“goodbey”上设置断点吗?

标签: c# wpf windows


【解决方案1】:

这是一种在 WPF 中控制打开和关闭操作的方法。

App.xaml下,打开App.xaml.cs,修改如下。

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private void App_Startup(object sender, StartupEventArgs e)
        {
            // Code for before window opens (optional);

            var mainWindow = new MainWindow();
            mainWindow.Show();

            mainWindow.Closed += Window_Closed;
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            // Code for after window closes goes here.
            MessageBox.Show("Goodbye World!");
        }
    }
}

并将App.xaml更改为如下使用:

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             Startup="App_Startup" >
    <Application.Resources>

    </Application.Resources>
</Application>

这里的关键变化是Startup="App_Startup"

这些使您更容易准确地了解每个操作何时发生,因为它使入口和出口点更加清晰。

注意:如果您希望用户能够取消退出应用程序,但您的示例代码不是您要查找的内容,这将不起作用。

【讨论】:

  • 很高兴它对你有用。顺便说一句,我现在注意到您没有“Closed += DataWindow_Closing;”在您发布的构造函数代码中。这就是将方法与事件联系起来的原因。添加它并将“控制台”更改为“消息框”也可以。
【解决方案2】:

阅读您希望在用户关闭应用程序时向用户显示消息的帖子。 由于您是 C# 新手,我建议您先使用控制台应用程序,然后再继续使用 WPF,这是一个开发良好且文档齐全的框架,它允许您使用所谓的 XAML Extensible Application Markup Language 设计您的应用程序

旁注 Console.WriteLine("Hello World");默认情况下将打印到输出窗口,并且不应显示任何其他视觉效果 参考文献。

永远不会少。 您想调用事件 Closing 并在其中调用 MessageBox 类并使用其中一个将文字字符串作为参数的函数。 MessageBox.Show("Goodbye user!");

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    //When your application finished initializing it's components this will run
    MessageBox.Show("Hello User!");
        }

//This being the event
        private void mainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            MessageBox.Show("Goodbye User!");
        }
    }

以及 XAML,因为您将事件从 XAML(前端)路由到后端

<Window x:Name="mainWindow" x:Class="HelloWorld.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:HelloWorld"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800" Closing="mainWindow_Closing">
    <Grid>

    </Grid>
</Window>

【讨论】:

  • 谢谢你!我试过了,但由于某种原因从未调用过 mainWindow_Closing 函数
  • @JoshJoshJosh 我更新了答案,提供了相应的 XAML 代码。
  • @JoshJoshJosh 请记住,WPF 建立在用于 MVVM 的框架之上,这使得数据绑定在其中发挥了重要作用。所以定义事件后端是不好的做法,尽量将业务逻辑与 UI 分离。
【解决方案3】:

您的控制台窗口会显示片刻,然后立即关闭。您需要从用户那里读取密钥并等待输入以使其保持打开状态。

void DataWindow_Closing(object sender, CancelEventArgs e)
    {
        Console.WriteLine("Goodbey World!");
        Console.ReadLine();
    }

这是假设你的函数完全被击中了。

【讨论】:

  • 我正在做一个窗口应用程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-22
  • 2016-12-23
相关资源
最近更新 更多