1

我正在从托盘应用程序打开 WPF 窗口。我使用以下代码打开窗口:

        if (gui == null)
        {
            gui = new App();
            gui.MainWindow = new mainWindow();
            gui.InitializeComponent();
            IsUIOpen = true;
        }
        else if (!IsUIOpen)
        {
            gui.InitializeComponent();
            gui.MainWindow.Show();
            gui.MainWindow = new mainWindow();
            IsUIOpen = true;
        }

我需要从 App 级别运行 UI,因为它使用资源字典。问题是,当用户关闭窗口时,我需要运行代码,但似乎没有一个事件处理程序通知我。

我尝试了以下方法:

gui.Exit += new System.Windows.ExitEventHandler(settings_FormClosed);
gui.MainWindow.Closed += new EventHandler(settings_FormClosed);

我也尝试过gui.Deactivated, gui.SessionEnding, gui.MainWindow.Closing, gui.MainWindow.Deactivated, 可能还有其他一些。

当用户关闭窗口时,会从 Shell.xaml 调用此代码:

    private void Cancel_Click(object sender, RoutedEventArgs e)
    {
        presenter.Close();
        this.Close();
    }

我意识到 App 是静态的,所以它永远不会关闭,但是这些事件处理程序之一应该将我连接到关闭事件。

如果有用,流程如下:TrayApp.cs -> App.xaml -> Shell.xaml

任何建议,将不胜感激。提前致谢。

4

2 回答 2

1

你应该试试Closing事件。本文提供了有关 WPF 何时实际关闭(不仅仅是窗口)的有用信息。

于 2012-10-02T19:12:16.657 回答
0

乔希能够给出正确的解决方案。你可以在这里看到他的回答。

基本上,我需要将 WPF 作为一个单独的进程启动,然后使用 MyProcess.WaitForEnd() 调用。我将此添加到一个线程中,这样它就不会阻塞托盘。代码如下:

Process myProcess = new Process();
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.FileName = "C:\\mysettingsapp\\mysettingsapp.exe"; // replace with path to your settings app
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();
// the process is started, now wait for it to finish
myProcess.WaitForExit();  // use WaitForExit(int) to establish a timeout
于 2012-10-04T21:57:32.490 回答