Cuando trato de usar VistaFolderBrowserDialog en mi aplicación WPF .NET 4.6.1, cuelga la aplicación. Si lo ejecuto bajo el depurador (en modo Debug o Release), funciona muy bien.
Intenté reproducir esto en la aplicación de muestra cambiando varias llamadas y cambiando al paquete Nuget, todavía funciona bien.
Intenté simplificar la forma en que llamo a VistaFolderBrowserDialog y copié / pegué el código de muestra en mi aplicación, pero todavía se cuelga.
¿Alguna idea sobre por qué o cómo localizar el problema?
Hola @matelich , no puedo reproducir el comportamiento de suspensión que describiste.
Se adjunta un proyecto de muestra de una aplicación WPF que usa .NET 4.6.1 que abre VistaFolderBrowserDialog
usando Ookii.Dialogs.Wpf v1.1.0 (_ más reciente al momento de escribir este artículo_) y pude ejecutar un:
Debug
build _sin_ el depurador adjuntoDebug
build _with_ el depurador adjuntoRelease
build _sin_ el depurador adjuntoRelease
build _with_ el depurador adjuntoNo se produjo ningún ahorcamiento ni excepción.
Si me puede proporcionar una forma de reproducir el comportamiento de suspensión, estaría encantado de investigar más a fondo.
El código relevante en la muestra adjunta:
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");
}
Gracias por responderme rápidamente, @augustoproiete. Probé varios pasos de reproducción para explorar cosas. Voy a intentar agregar más uso a mis otras aplicaciones de WPF para ver si hay algún factor común que pueda identificar por qué no funciona.
Ingresé un poco y lo reproduje en mi aplicación, el bloqueo está en int result = dialog.Show(owner);
en private bool RunDialog(IntPtr owner)
parece relacionado:
Estoy experimentando lentitud cuando la ruta seleccionada es una ruta de red larga.
Si habilito Native code debugging
, veo que la mayor parte del tiempo se gasta en algún lugar de esta pila de llamadas:
win32u.dll!NtUserMsgWaitForMultipleObjectsEx
() Desconocido
user32.dll! RealMsgWaitForMultipleObjectsEx () Desconocido
shell32.dll! SHProcessMessagesUntilEventsEx () Desconocido
shell32.dll! CChangeRouterProxy :: RegisterThread () Desconocido
shell32.dll! SHChangeNotifyRegisterThread
() Desconocido
comdlg32.dll! CFileOpenSave :: Show () Desconocido
[Transición administrada a nativa]
Ookii.Dialogs.Wpf.dll! Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog (propietario de System.IntPtr) Línea 171 C #
Ookii.Dialogs.Wpf.dll! Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog (propietario de System.Windows.Window) Línea 157 C #
Ookii.Dialogs.Wpf.Sample.exe! Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog () Línea 166 C #
Ookii.Dialogs.Wpf.Sample.exe! Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click (remitente del objeto, System.Windows.RoutedEventArgs e) Línea 56 C #
o:
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#
o:
ntdll.dll!RtlpHashStringToAtom() Unknown
ntdll.dll!RtlpFreeAllAtom
() Desconocido
ntdll.dll! RtlpDereferenceAtom () Desconocido
ntdll.dll! RtlDeleteAtomFromAtomTable () Desconocido
kernel32.dll! InternalDeleteAtom
() Desconocido
dui70.dll! DirectUI :: Value :: _ ZeroRelease () Desconocido
dui70.dll! DirectUI :: DUIXmlParser :: _ DestroyTables (void) Desconocido
dui70.dll! DirectUI :: DUIXmlParser :: ~ DUIXmlParser () Desconocido
dui70.dll! DirectUI :: DUIXmlParser :: `vector eliminando destructor '() Desconocido
dui70.dll! DirectUI :: AccHDelete
shell32.dll! _DUI_ShellStyleSheet_UninitThreadIfPossible (void) Desconocido
shell32.dll! DUI_ShellStyleSheet_UninitThread (void) Desconocido
shell32.dll! CDUIViewFrame :: DestroyFrameWindow (void) Desconocido
shell32.dll! CExplorerBrowser :: _ CleanupFrame (void) Desconocido
shell32.dll! CExplorerBrowser :: Destroy () Desconocido
comdlg32.dll! CFileOpenSave :: _ OnDestroyDialog () Desconocido
comdlg32.dll! CFileOpenSave :: s_OpenSaveDlgProc () Desconocido
user32.dll! UserCallDlgProcCheckWow () Desconocido
user32.dll! DefDlgProcWorker () Desconocido
user32.dll! DefDlgProcW
() Desconocido
user32.dll! UserCallWinProcCheckWow () Desconocido
user32.dll! DispatchClientMessage () Desconocido
user32.dll! __ fnDWORD
() Desconocido
ntdll.dll! KiUserCallbackDispatcherContinue
() Desconocido
win32u.dll! NtUserDestroyWindow
() Desconocido
user32.dll! DialogBox2 () Desconocido
user32.dll! InternalDialogBox () Desconocido
user32.dll! DialogBoxIndirectParamAorW
() Desconocido
user32.dll! DialogBoxIndirectParamW
() Desconocido
comdlg32.dll! CFileOpenSave :: Show () Desconocido
[Transición administrada a nativa]
Ookii.Dialogs.Wpf.dll! Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.RunDialog (propietario de System.IntPtr) Línea 171 C #
Ookii.Dialogs.Wpf.dll! Ookii.Dialogs.Wpf.VistaFolderBrowserDialog.ShowDialog (propietario de System.Windows.Window) Línea 157 C #
Ookii.Dialogs.Wpf.Sample.exe! Ookii.Dialogs.Wpf.Sample.MainWindow.ShowFolderBrowserDialog () Línea 166 C #
Ookii.Dialogs.Wpf.Sample.exe! Ookii.Dialogs.Wpf.Sample.MainWindow._showDialogButton_Click (remitente del objeto, System.Windows.RoutedEventArgs e) Línea 56 C #
Comentario más útil
Gracias por responderme rápidamente, @augustoproiete. Probé varios pasos de reproducción para explorar cosas. Voy a intentar agregar más uso a mis otras aplicaciones de WPF para ver si hay algún factor común que pueda identificar por qué no funciona.
Ingresé un poco y lo reproduje en mi aplicación, el bloqueo está en
int result = dialog.Show(owner);
enprivate bool RunDialog(IntPtr owner)