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

リソース ディクショナリを使用するため、アプリ レベルから UI を実行する必要があります。問題は、ウィンドウがユーザーによって閉じられたときにコードを実行する必要があることですが、どのイベント ハンドラーも私に通知していないようです。

私は次のことを試しました:

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

gui.Deactivatedgui.SessionEndinggui.MainWindow.Closinggui.MainWindow.Deactivated、およびおそらく他のいくつかも試しました。

ユーザーがウィンドウを閉じると、次のコードが Shell.xaml から呼び出されます。

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

App は静的であるため、閉じることはありませんが、これらのイベント ハンドラーの 1 つを閉じるイベントに接続する必要があります。

役に立つ場合の流れは次のとおりです: TrayApp.cs -> App.xaml -> Shell.xaml

任意の提案をいただければ幸いです。前もって感謝します。

4

2 に答える 2

1

Closingイベントを試してみてください。この記事では、(ウィンドウだけでなく) WPF が実際に閉じられるタイミングに関する有用な情報を提供します。

于 2012-10-02T19:12:16.657 に答える
0

Josh は正しい解決策を提供することができました。彼の答えはここで見ることができます。

基本的に、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 に答える