0

重複の可能性:
WPF UI が閉じるときの通知

以前にもよく似た質問をしたことがありますが、有用な回答は得られませんでした。誰かが私を助けてくれることを願っています。

Windows フォーム アプリとしてプログラムされた既存のトレイ アプリがあります。WPF としてプログラムされた既存の設定フォームがあります。

トレイ アプリは次のことができる必要があります。 * 設定アプリを n 回開きます。一度に開くインスタンスは 1 つだけです。 * ユーザーが設定アプリを閉じたときに通知を受け取ります。

設定アプリは ResourceDictionary を使用します。これは、App.xaml から開始する必要があることを意味すると思います。

設定ウィンドウを一度開いて、次のコードを使用してシャットダウンしたときにトレイに通知することはできますが、再度開くことはできません。

        if (gui == null)
        {
            //shell = new mainWindow();
            //shell.CloseEvent += settings_FormClosed;

            gui = new App();
            //gui.ShutdownMode = ShutdownMode.OnExplicitShutdown;
            gui.MainWindow = shell;
            gui.InitializeComponent();
            //gui.Run();
            gui.Exit += new System.Windows.ExitEventHandler(settings_FormClosed);

            IsUIOpen = true;
        }

上記の行のコメントを外すと、close イベントをインターセプトし、Visibility を Hidden に設定できます。次にユーザーが [設定] を選択したときに、[表示] に戻すことができます。ただし、初めて設定を開いたときに、Exit イベントがトリガーされず、シェルがすべての ReferenceDictionary を取得していない (または参照ディクショナリーへのアクセスが失われている) ため、ウィンドウが正しく表示されません。

アプリから WPF を実行し、MainWindow (多くの場合 null のようで、自分のウィンドウのタイプではない) にアクセスして、カスタム リスナーを mainWindow に追加できるようにする方法はありますか?

または、ユーザーが次に [設定] をクリックしたときに静的アプリを再インスタンス化できるように、静的アプリを破棄する方法はありますか。

WPF を Win フォームとうまく連携させるには、何らかの方法が必要であることはわかっています。助けようとするすべての人に感謝します。これは私に大きな頭痛の種を与えています。

4

1 に答える 1

1

設定はアプリなので、Winformsアプリ内からSystem.Diagnostics.Processを使用して、WPF設定アプリを起動します。設定をウィンドウとして呼び出すのではなく、アプリケーションとして開始するため、スタイルが読み込まれます。また、ProcessのWaitForExit()またはWaitForExit(int)メソッドを使用して、設定アプリが終了するのを待ち、設定アプリが完了したときにのみ制御をWinformsアプリに戻すことができます。これは、設定アプリを閉じたときに要求される通知としても機能します。

簡単なコードの抜粋は次のとおりです。

設定を開くイベントWPFAPP:

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

メインスレッドでWaitForExitを呼び出すと、WinFormsアプリはブロックされ、設定アプリが完了するのを待ちます。これにより、ユーザーが複数の設定ウィンドウを開くことができなくなります。Winformsアプリの非ブロッキング要件は表示されませんでした。ですから、ブロックできない場合は、別の方法を考え出すことができます。

UPDATE 実行中のアセンブリのパスを取得するには:

  string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase );
于 2012-10-04T19:43:59.043 に答える