2011-09-08 21 views
4

我在我的WPF應用程序中使用了第三方WinForms登錄對話框,出於某種原因,這使得我的WPF應用程序在調試時無法正確關閉。爲什麼我的WPF應用程序在顯示一個WinForms對話框後不能正常關閉?

如果我在登錄前退出winforms登錄對話框,應用程序會正常關閉,但是如果我成功登錄並啓動WPF窗口,退出窗口不會關閉應用程序。

我把一個斷點放在OnExit方法App,它永遠不會被調用。我覆蓋了我的主窗口的OnClosing方法,但確實被調用,但即使調用Application.Current.ShutDown()也沒有正確退出應用程序。我也嘗試將我的應用程序的ShutdownMode設置爲OnExplicitShutdownOnMainWindowClose,並且都沒有關閉它。

我唯一的提示是出現在調試窗口中,但我不知道它試圖告訴我什麼。

The thread 'vshost.RunParkingWindow' (0xf74) has exited with code 0 (0x0). 
The thread <No Name> (0x1b58) has exited with code 0 (0x0). 

此行爲僅在Visual Studio中以調試模式運行時纔會發生。在沒有調試的情況下運行應用程序會正確關閉應用

任何人都可以指出我在正確的方向,以什麼可能會導致此行爲?

編輯

的WinForms的登錄對話框不是傳統的登錄對話框與Show()Close()方法,那就是隻有一個Login()Logout()方法的靜態類。

它使用someething這樣的:

if (CompanyNamespace.ApplicationName.Login()) 
{ 
    var shell = new ShellView(); 
    var context = new ShellViewModel(); 
    shell.DataContext = context; 
    shell.Show(); 

    // When the Shell Window gets closed, the debugger doesn't stop 
} 
else 
{ 
    Application.Current.Shutdown(); // Works fine 
} 
+0

你可以告訴你顯示登錄對話框和登錄方式後的方式你打開主窗口? –

+0

@Davide我添加了一些示例代碼 – Rachel

+0

@Rachel:btw,你檢查是否設置了Application.Current.MainWindow?它可能是空的,因爲第一個打開的窗口是WinForms對話框 – sll

回答

3

這聽起來很愚蠢,但你有沒有試着撥打winformsLoginDialog.Close();在主窗口的onClosing方法中?我懷疑winforms登錄對話框仍然有一個線程正在運行,和/或窗體可能已隱藏,而不是關閉。

你可以嘗試System.Environment.Exit(0)

+0

我沒有真正的密切方法......它是一個封閉的第三方靜態對話框,所以我真的必須調用「Login()」和「Logout()」,並且在調用'Logout ()' – Rachel

+1

你可以試試System.Environment.Exit(0); – hcb

+0

<3謝謝!改變你的答案,我會接受它。這可以關閉在WinForms對話框中打開的任何線程 – Rachel

1

我相信默認的關機模式是

ShutdownMode = ShutdownMode.OnLastWindowClose 

如果應用程序沒有關閉則仍有打開的窗口。檢查調試器中的Application.Current.Windows集合以查找違規窗口。

所以它的最好的,在我看來,使用

ShutdownMode = ShutdownMode.OnMainWindowClose; 

並確保設置以下

Application.Current.MainWindow= MyWindow; // Shell etc. 
+0

仍然發生相同的行爲。另外,'Application.Current.Windows'只有一個窗口,即Shell。 – Rachel

+0

@Rachel:並設置Application.Current.MainWindow = Shell; ? – bic

+0

它被自動設置爲Shell,但是即使我明確設置它,也會發生相同的行爲 – Rachel

相關問題