Ookii-dialogs-wpf: VistaOpenFileDialog.InitialDirectory se ignora

Creado en 26 sept. 2019  ·  9Comentarios  ·  Fuente: ookii-dialogs/ookii-dialogs-wpf

Se ignora la inicialización de un diálogo con la propiedad InitialDirectory establecida en una carpeta local y existente.
El cuadro de diálogo siempre muestra la última carpeta donde se abrió un archivo.

 VistaOpenFileDialog dialog = new VistaOpenFileDialog();
 dialog.Filter = "JSON Dateien (*.json)|*.json";
 dialog.InitialDirectory = "C:\\";

Comportamiento esperado:
El VistaOpenFileDialog siempre muestra el contenido de C: \ cuando InitialDirectory está configurado en "C: \".

Windows 10 Pro 1903 / .Net Framework 4.6

good first issue hacktoberfest help wanted needs-design

Comentario más útil

Si bien es cierto que muchas aplicaciones de Windows tienen un comportamiento predeterminado "inteligente" para recordar su última ruta, hay muchas situaciones en las que el desarrollador de una aplicación desea especificar un directorio inicial particular para ayudar al usuario. Para nuestro panorama de aplicaciones, este es incluso el comportamiento predeterminado, ya que nuestros usuarios esperan cargar / guardar en directorios específicos relacionados con el proyecto. Usar el último directorio "inteligente" del bloc de notas / paint / word es molesto e inútil aquí.

Más: Microsoft.Win32.OpenFileDialog tiene exactamente la misma propiedad y la usa como se esperaba.

Todos 9 comentarios

Gracias por denunciar a @soulflyman. Sin embargo, creo que este es el comportamiento "correcto", ya que coincide con lo que sucede en todas las demás aplicaciones que vienen con Windows, es decir, recuerdan la última carpeta utilizada.

Debería poder reproducir lo mismo con el Bloc de notas o Paint.

@buildcomplete informó un problema similar con PR # 2, por lo que quizás necesitemos una forma de anular este comportamiento de alguna manera (?), idealmente como una configuración de suscripción que no introduce un cambio importante.

Eso suena genial, estaría muy bien con un nuevo settign como mencionaste.

Estaba al tanto del comportamiento predeterminado (como el bloc de notas), pero esperé que este comportamiento cambiara cuando InitialDirectory se configura manualmente.
Mi suposición era que InitialDirectory estaba destinado a ser el directorio que se muestra cada vez que se muestra el cuadro de diálogo o al menos en esta instancia en ejecución de la aplicación. No esperaba ser ignorado incluso después de cerrar y reiniciar la aplicación.

Estoy experimentando el mismo problema.
Experimenté con diferentes formas / orden de configurar las diversas propiedades de VistaSaveFileDialog sin éxito. El cuadro de diálogo siempre ignora la configuración InitialDirectoy y usa la configuración predeterminada.

Confirmé que '_initialDirectory' se establece en mi ruta deseada en VistaFileDialog.cs.
A partir de ahí, el valor llega a CreateItemFromParsingName(string path) en NativeMethods.cs, y luego desaparece por el agujero COM.

[DllImport("shell32.dll", CharSet = CharSet.Unicode)]
public static extern int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IntPtr pbc, ref Guid riid, [MarshalAs(UnmanagedType.Interface)] out object ppv);

  public static Interop.IShellItem CreateItemFromParsingName(string path)
 {
     object item;
     Guid guid = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe"); // IID_IShellItem
     int hr = NativeMethods.SHCreateItemFromParsingName(path, IntPtr.Zero, ref guid, out item);
     if( hr != 0 )
         throw new System.ComponentModel.Win32Exception(hr);
     return (Interop.IShellItem)item;
 }

Este método SHCreateItemFromParsingName parece fallar, ya que el objeto COM devuelto parece ser nulo.

CreateItemFromParsingName

Agregué SetLastError = true a la firma del método e intenté Marshal.GetLastWin32Error() después de la llamada, pero devuelve 0.

Si bien es cierto que muchas aplicaciones de Windows tienen un comportamiento predeterminado "inteligente" para recordar su última ruta, hay muchas situaciones en las que el desarrollador de una aplicación desea especificar un directorio inicial particular para ayudar al usuario. Para nuestro panorama de aplicaciones, este es incluso el comportamiento predeterminado, ya que nuestros usuarios esperan cargar / guardar en directorios específicos relacionados con el proyecto. Usar el último directorio "inteligente" del bloc de notas / paint / word es molesto e inútil aquí.

Más: Microsoft.Win32.OpenFileDialog tiene exactamente la misma propiedad y la usa como se esperaba.

Tengo la misma necesidad.
¿Podría agregar una configuración que permita establecer el directorio inicial del cuadro de diálogo, por favor?
Gracias.

Entré en el código de la biblioteca Ookii. luego encontré cómo tener en cuenta la propiedad InitialDirectory .
Deberá cambiar esta línea de código al archivo VistaFileDialog.cs
En el método internal virtual void SetDialogProperties(Ookii.Dialogs.Wpf.Interop.IFileDialog dialog)
cambiar este fragmento de código

// Initial directory
if( !string.IsNullOrEmpty(_initialDirectory) )
{
    Ookii.Dialogs.Wpf.Interop.IShellItem item = NativeMethods.CreateItemFromParsingName(_initialDirectory);
    dialog.SetDefaultFolder(item);
}

a

// Initial directory
if( !string.IsNullOrEmpty(_initialDirectory) )
{
    Ookii.Dialogs.Wpf.Interop.IShellItem item = NativeMethods.CreateItemFromParsingName(_initialDirectory);
    dialog.SetFolder(item);
}

Eso esta terminado.
Ahora el diálogo de Ookii comenzará en la propiedad InitialDirectory .

Espero que pueda ayudar.

@ gitjsdr26 podrías crear un PR para @augustoproiete

@nzain , lo siento, no sé cómo hacer esto con GitHub.

Ok, he reunido más información para aclarar este problema.

Hablamos de una propiedad InitialDirectory como la documentada para OpenFileDialog.InitialDirectory de WPF. La documentación dice:

Obtiene o establece el directorio inicial que se muestra en un cuadro de diálogo de archivo.

Los usuarios de Ookii Dialogs esperarán el mismo comportamiento porque la propiedad tiene el mismo nombre. Estoy de acuerdo, en muchas situaciones esta propiedad no debe establecerse (bloc de notas, etc.), pero esa es una historia diferente. _Si_ la propiedad está configurada, debería funcionar como se esperaba.

El InitialDirectory no debe confundirse con IFileDialog::SetDefaultFolder que se llama actualmente. Aquí la documentación dice:

Establece la carpeta utilizada como predeterminada si no hay un valor de carpeta utilizado recientemente disponible.

No estoy seguro de si esto (ninguna carpeta usada recientemente disponible) es el caso. Establecer la carpeta predeterminada nunca tuvo ningún efecto para mí. Si esa funcionalidad es necesaria para alguien, debería estar disponible como una propiedad DefaultDirectory . Podría ser un artefacto obsoleto de los viejos tiempos; si alguien sabe cuándo tiene un efecto, hágamelo saber.

PR?

El PR # 2 está abierto desde hace dos años (!) Y sugiere algo similar. Aunque el autor @buildcomplete menciona que está funcionando al menos una vez en su escenario. Su solución parece estar basada en código antiguo, pero hace lo mismo que sugiere @ gitjsdr26 : cambiar la llamada
IFileDialog::SetDefaultFolder(...) a IFileDialog::SetFolder(...) .

No quiero perder el tiempo con la creación de relaciones públicas (también cambiaría esta única línea).

@augustoproiete , háganos saber lo que piensa sobre esto :)

¿Fue útil esta página
0 / 5 - 0 calificaciones