2011-04-12 57 views
3

我有一個C++ windows應用程序調用到調用到託管庫的C++/cli庫中。託管庫調用OpenFileDialog.Show與Win32窗口所擁有的WPF窗口父級。我還沒有找到更好的方法來做到這一點,我在這裏閱讀的所有資源和搜索谷歌和social.msdn建議做我在做什麼。帶有Win32父窗口的WPF OpenFileDialog;窗口關閉時沒有重新獲得焦點

對話框打開很好,但是當我點擊取消按鈕時,應用程序完全失去焦點。我不知道爲什麼會發生,但我似乎無法讓它停止。我已經嘗試了許多不同的東西無濟於事。

如果我只是啓動OpenFileDialog而不創建一個WPF窗口,我沒有看到問題。 如果我沒有設置WPF窗口的所有者,我看不到問題。如果我調用OpenFileDialog.Show並且不通過父項,但仍然創建WPF窗口並設置它的所有者,我仍然會看到問題。

我能夠破解它設置父應用程序窗口前景失去焦點後,但我不想。

我已經上傳了我的方案的一個小例子的解決方案,說明了這個問題:

http://dl.dropbox.com/u/26054523/MixedExample.zip

任何幫助,將不勝感激。

+0

您是否嘗試過在同一個線程上運行對話框? WinForms和Win32都是單線程的。它可能不喜歡你從另一個線程打開對話框。 – 2011-04-12 18:04:29

+0

是的,我有,它不會允許它。在另一個線程中打開的原因是因爲WPF似乎想要在STA線程中運行。 – Jay 2011-04-12 18:27:26

+0

我有一個與C#類似的問題。出於某種原因,一旦OpenFileDialog被解除(通過OK或取消)程序失去焦點。 – Superbest 2012-04-07 02:18:38

回答

0

您是否嘗試過反轉託管方案?現在,這聽起來像你要unmanaged-> bridge-> managed-> WPF-> Winforms。也許你可以去......託管 - > WinForms->使用ElementHost的WPF http://msdn.microsoft.com/en-us/library/ms742215.aspx

這樣,WPF窗口就會成爲WinForms應用程序的子控件,對於焦點開關來說可能會更好。 WinForms控件並非真正用於直接與WPF應用程序一起工作,而是使用了兩種不同的UI線程設置。

+0

鑑於非託管代碼庫的規模和複雜性,這是一個重大變化。此外,沒有任何WinForms。目標是非託管窗口只調用託管WPF。 – Jay 2011-04-13 11:33:25

+0

很抱歉聽到這個消息。在工作中,我們或多或少直接在WPF中記錄了打開的文件對話框,以便與我們的窗口系統一起工作。有一種痛苦是沒有更好的股票期權,我認爲它是WPF的一般問題之一:股票對話框可能會非常棘手,除非您編碼自己,然後他們很多工作。 – 2011-04-16 23:11:31

0

我知道這是一箇舊帖子,但我認爲這是一個常見問題,我有一個很好的答案。如果你有一個叫做WPFChild你可以這樣做一個WPF子窗口被稱爲ParentWindow一個Win32窗口父窗口和:

using System.Windows.Interop; 

void OpenWindow() 
{ 
    WPFChildWindow WPFChild = new WPFChildWindow(); 
    WindowInteropHelper helper = new WindowInteropHelper(WPFChild) 
    { 
     Owner = new NativeWindowWrapper(ParentWindow.Hwnd).Handle 
    }; 
    bool? ret = _stepsForm.ShowDialog(); 
} 

這會讓孩子窗口保持在家長和功能的對話框的頂部。請記住,WPF窗口不會返回DialogResult,而是返回一個可爲空的布爾值。

NativeWindow包裝器是一個簡單的類,它將int轉換爲IntPtr。它實際上來自一個.net excel編輯項目位於:How to code a .NET RefEdit ControlT