Ketika saya mencoba menggunakan VistaFolderBrowserDialog di aplikasi WPF .NET 4.6.1 saya, aplikasi hang. Jika saya menjalankannya di bawah debugger (dalam mode Debug atau Rilis) itu berfungsi dengan baik.
Saya sudah mencoba mengulangi ini di aplikasi sampel dengan mengubah berbagai panggilan dan beralih ke paket Nuget, masih berfungsi dengan baik.
Saya telah mencoba menyederhanakan cara saya memanggil VistaFolderBrowserDialog dan menyalin/menempelkan kode sampel ke aplikasi saya, masih hang.
Adakah pemikiran tentang mengapa atau bagaimana melacak masalah ini?
Hai @matelich, saya tidak dapat mereproduksi perilaku menggantung yang Anda gambarkan.
Terlampir adalah contoh proyek aplikasi WPF menggunakan .NET 4.6.1 yang membuka VistaFolderBrowserDialog
menggunakan Ookii.Dialogs.Wpf v1.1.0 (_terbaru pada tulisan ini_) dan saya dapat menjalankan:
Debug
build _tanpa_ debugger terpasangDebug
build _dengan_ debugger terpasangRelease
build _tanpa_ debugger terpasangRelease
build _dengan_ debugger terpasangTidak ada gantung atau pengecualian yang terjadi.
Jika Anda dapat memberi saya cara untuk mereproduksi perilaku menggantung, saya akan dengan senang hati menyelidiki lebih lanjut.
Kode yang relevan dalam contoh terlampir:
var dialog = new VistaFolderBrowserDialog
{
Description = "Please select a folder.",
UseDescriptionForTitle = true,
};
if (!VistaFolderBrowserDialog.IsVistaFolderDialogSupported)
{
MessageBox.Show(this,
"You are using an old Windows version. The regular folder browser dialog will open.",
"Sample folder browser dialog");
}
if (dialog.ShowDialog(this).GetValueOrDefault(false))
{
MessageBox.Show(this, "The selected folder was: " + dialog.SelectedPath,
"Sample folder browser dialog");
}
Terima kasih telah menghubungi saya dengan cepat, @augustoproiete. Saya memang mencoba berbagai langkah repro untuk menjelajahi berbagai hal. Akan mencoba menambahkan lebih banyak penggunaan ke aplikasi WPF saya yang lain untuk melihat apakah ada beberapa faktor umum yang mungkin mengidentifikasi mengapa itu tidak berfungsi.
Saya memasukkan beberapa login dan mereproduksi dalam aplikasi saya, hang ada di int result = dialog.Show(owner);
di private bool RunDialog(IntPtr owner)
tampaknya terkait:
Saya mengalami kelambatan ketika jalur yang dipilih adalah jalur jaringan yang panjang.
Jika saya mengaktifkan Native code debugging
, saya melihat bahwa sebagian besar waktu dihabiskan di suatu tempat di tumpukan panggilan ini:
win32u.dll!NtUserMsgWaitForMultipleObjectsEx
() Tidak dikenal
user32.dll!RealMsgWaitForMultipleObjectsEx() Tidak Diketahui
shell32.dll!SHProcessMessagesUntilEventsEx() Tidak Diketahui
shell32.dll!CChangeRouterProxy::RegisterThread() Tidak Diketahui
shell32.dll!SHChangeNotifyRegisterThread
() Tidak dikenal
comdlg32.dll!CFileOpenSave::Show() Tidak Diketahui
[Berhasil ke Transisi Asli]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(Pemilik System.IntPtr) Baris 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner) Baris 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() Baris 166 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(pengirim objek, System.Windows.RoutedEventArgs e) Baris 56 C#
atau:
win32u.dll!00007ff9d17c9164() Unknown
user32.dll!00007ff9d2ca059d() Unknown
shell32.dll!SHProcessMessagesUntilEventsEx() Unknown
shell32.dll!CChangeRouterProxy::RegisterThread() Unknown
shell32.dll!SHChangeNotifyRegisterThread() Unknown
comdlg32.dll!CFileOpenSave::Show() Unknown
[Managed to Native Transition]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(System.IntPtr owner) Line 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner) Line 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() Line 166 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(object sender, System.Windows.RoutedEventArgs e) Line 56 C#
atau:
ntdll.dll!RtlpHashStringToAtom() Unknown
ntdll.dll!RtlpFreeAllAtom
() Tidak dikenal
ntdll.dll!RtlpDereferenceAtom() Tidak Diketahui
ntdll.dll!RtlDeleteAtomFromAtomTable() Tidak Diketahui
kernel32.dll!InternalDeleteAtom
() Tidak dikenal
dui70.dll!DirectUI::Nilai::_ZeroRelease() Tidak Diketahui
dui70.dll!DirectUI::DUIXmlParser::_DestroyTables(void) Tidak diketahui
dui70.dll!DirectUI::DUIXmlParser::~DUIXmlParser() Tidak Diketahui
dui70.dll!DirectUI::DUIXmlParser::`vektor menghapus destructor'() Tidak diketahui
dui70.dll!DirectUI::AccHDelete
shell32.dll!_DUI_ShellStyleSheet_UninitThreadIfPossible(void) Tidak diketahui
shell32.dll!DUI_ShellStyleSheet_UninitThread(void) Tidak diketahui
shell32.dll!CDUIViewFrame::DestroyFrameWindow(void) Tidak diketahui
shell32.dll!CExplorerBrowser::_CleanupFrame(void) Tidak diketahui
shell32.dll!CExplorerBrowser::Destroy() Tidak Diketahui
comdlg32.dll!CFFileOpenSave::_OnDestroyDialog() Tidak Diketahui
comdlg32.dll! CFileOpenSave::s_OpenSaveDlgProc() Tidak Diketahui
user32.dll!UserCallDlgProcCheckWow() Tidak Diketahui
user32.dll!DefDlgProcWorker() Tidak Diketahui
user32.dll!DefDlgProcW
() Tidak dikenal
user32.dll!UserCallWinProcCheckWow() Tidak Diketahui
user32.dll!DispatchClientMessage() Tidak Diketahui
user32.dll!__fnDWORD
() Tidak dikenal
ntdll.dll!KiUserCallbackDispatcherLanjutkan
() Tidak dikenal
win32u.dll!NtUserDestroyWindow
() Tidak dikenal
user32.dll!DialogBox2() Tidak Diketahui
user32.dll!InternalDialogBox() Tidak Diketahui
user32.dll!DialogBoxIndirectParamAorW
() Tidak dikenal
user32.dll!DialogBoxIndirectParamW
() Tidak dikenal
comdlg32.dll!CFileOpenSave::Show() Tidak Diketahui
[Berhasil ke Transisi Asli]
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog(Pemilik System.IntPtr) Baris 171 C#
Ookii.Dialogs.Wpf.dll!Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog(System.Windows.Window owner) Baris 157 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog() Baris 166 C#
Ookii.Dialogs.Wpf.Sample.exe!Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click(pengirim objek, System.Windows.RoutedEventArgs e) Baris 56 C#
Komentar yang paling membantu
Terima kasih telah menghubungi saya dengan cepat, @augustoproiete. Saya memang mencoba berbagai langkah repro untuk menjelajahi berbagai hal. Akan mencoba menambahkan lebih banyak penggunaan ke aplikasi WPF saya yang lain untuk melihat apakah ada beberapa faktor umum yang mungkin mengidentifikasi mengapa itu tidak berfungsi.
Saya memasukkan beberapa login dan mereproduksi dalam aplikasi saya, hang ada di
int result = dialog.Show(owner);
diprivate bool RunDialog(IntPtr owner)