2012-10-04 197 views
0

可能重複:
Notification when WPF UI closesWPF打開設置窗口從窗體應用程序

我剛纔問了一個非常類似的問題,但我沒有得到任何有用的響應。我希望有人能幫助我。

我有一個現有的托盤應用程序被編程爲Windows窗體應用程序。 我有一個現有的設置窗體編程爲WPF。

托盤應用程序需要能夠: *打開設置應用程序n次,一次只打開一個實例 *當用戶關閉設置應用程序時接收通知。

設置應用程序使用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; 
     } 

如果我取消上面的行註釋,然後我可以攔截關閉事件,並將可見性設置爲隱藏。用戶下次選擇「設置」時,我可以將其設置爲「可見」。但是,第一次打開Settings時,它不會觸發Exit事件,並且Shell不會獲取所有的ReferenceDictionary(或者無法訪問它),所以窗口顯示不正確。

有沒有辦法從應用程序運行WPF,並訪問MainWindow(通常看起來是空的,而不是我自己的窗口的類型),所以自定義的監聽器可以添加到mainWindow?

或者,有沒有辦法處置靜態應用程序,以便下次用戶單擊設置時可以重新實例化它。

我知道必須有一些方法讓WPF和Win Forms一起玩。感謝所有嘗試提供幫助的人。這一直讓我頭痛。

回答

1

由於您的設置是一個應用程序,我會使用Winforms應用程序中的System.Diagnostics.Process來啓動您的WPF設置應用程序。由於您將設置作爲應用程序啓動,而不是嘗試將其作爲窗口調用,因此您的樣式將被加載。此外,您可以使用Process的WaitForExit()或WaitForExit(int)方法等待設置應用程序完成,只有在設置應用程序完成時才能將控制權交還給您的Winforms應用程序。這也可以作爲設置應用關閉時請求的通知。

這裏有一個快速的代碼片段:

期事件打開設置WPF應用程序:

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); 
+0

謝謝;這是一個很好的答案。我不希望代碼阻止,但我可以將其添加到單獨的線程來處理。我只有一個問題:有沒有辦法做到這一點,而不給絕對路徑? WPF是我解決方案中的一個項目;有沒有辦法引用它呢?再次感謝你的迴應。這一直困擾着我好幾天! – Tim

+0

我相信你必須提供一個完整的路徑,但如果它是解決方案的一部分,你可以通過Assembly對象獲取執行路徑並從那裏構建到你的Settings應用程序。我更新了上面的答案以顯示格式。 – Josh

+0

你真棒。我希望我可以把你的答案不止一個。非常感謝! – Tim

相關問題