Ookii-dialogs-wpf: VistaOpenFileDialog.InitialDirectory est ignoré

Créé le 26 sept. 2019  ·  9Commentaires  ·  Source: ookii-dialogs/ookii-dialogs-wpf

L'initialisation d'une boîte de dialogue avec la propriété InitialDirectory définie sur un dossier local et existant est ignorée.
La boîte de dialogue affiche toujours le dernier dossier dans lequel un fichier a été ouvert.

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

Comportement attendu:
Le VistaOpenFileDialog schow toujours le contenu de C: \ lorsque InitialDirectory est défini sur "C: \".

Windows 10 Professionnel 1903 / .Net Framework 4.6

good first issue hacktoberfest help wanted needs-design

Commentaire le plus utile

S'il est vrai que de nombreuses applications Windows ont un comportement par défaut «intelligent» pour se souvenir de votre dernier chemin, il existe de nombreuses situations dans lesquelles le développeur d'une application souhaite spécifier un répertoire initial particulier pour aider l'utilisateur. Pour notre paysage applicatif, c'est même le comportement par défaut, car nos utilisateurs s'attendent à charger / enregistrer dans des répertoires spécifiques liés au projet. Utiliser le dernier répertoire "intelligent" de notepad / paint / word est ennuyeux et inutile ici.

Plus: Le Microsoft.Win32.OpenFileDialog a exactement la même propriété et l'utilise comme prévu.

Tous les 9 commentaires

Merci d'avoir signalé @soulflyman. Cependant, je pense que c'est le comportement «correct» car il correspond à ce qui se passe dans toutes les autres applications fournies avec Windows - c'est-à-dire qu'ils se souviennent du dernier dossier utilisé.

Vous devriez pouvoir reproduire la même chose avec le Bloc-notes ou Paint.

@buildcomplete a signalé un problème similaire avec PR # 2, donc peut-être avons-nous besoin d'un moyen de contourner ce comportement d'une manière ou d'une autre (?), idéalement en tant que paramètre opt-in qui n'introduit pas de changement radical.

Cela semble génial, je serais tout à fait d'accord avec un nouveau règlement comme vous l'avez mentionné.

J'étais conscient du comportement par défaut (comme le bloc-notes) mais j'ai exprimé ce comportement pour qu'il change lorsque InitialDirectory est défini manuellement.
Mon hypothèse était que InitialDirectory était censé être le répertoire qui s'affiche à chaque fois que la boîte de dialogue est affichée ou du moins dans cette instance en cours d'exécution de l'application. Je ne m'attendais pas à être ignoré même après la fermeture et le redémarrage de l'application.

Je rencontre le même problème.
Expérimentation de différentes manières / ordre de définition des différentes propriétés de VistaSaveFileDialog sans succès. La boîte de dialogue ignore toujours le paramètre InitialDirectoy et utilise la valeur par défaut.

J'ai confirmé que '_initialDirectory' était défini sur le chemin souhaité dans VistaFileDialog.cs.
À partir de là, la valeur se dirige vers CreateItemFromParsingName(string path) dans NativeMethods.cs, puis elle disparaît dans le trou 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;
 }

Cette méthode SHCreateItemFromParsingName semble échouer, car l'objet COM renvoyé semble être nul?

CreateItemFromParsingName

J'ai ajouté SetLastError = true à la signature de la méthode et j'ai essayé Marshal.GetLastWin32Error() après l'appel, mais il renvoie 0.

S'il est vrai que de nombreuses applications Windows ont un comportement par défaut «intelligent» pour se souvenir de votre dernier chemin, il existe de nombreuses situations dans lesquelles le développeur d'une application souhaite spécifier un répertoire initial particulier pour aider l'utilisateur. Pour notre paysage applicatif, c'est même le comportement par défaut, car nos utilisateurs s'attendent à charger / enregistrer dans des répertoires spécifiques liés au projet. Utiliser le dernier répertoire "intelligent" de notepad / paint / word est ennuyeux et inutile ici.

Plus: Le Microsoft.Win32.OpenFileDialog a exactement la même propriété et l'utilise comme prévu.

J'ai le même besoin.
Pourriez-vous ajouter un paramètre qui pourrait permettre de définir le répertoire initial de la boîte de dialogue s'il vous plaît?
Merci.

Je suis entré dans le code de la bibliothèque Ookii. puis j'ai trouvé comment prendre en compte la propriété InitialDirectory .
Vous devez changer cette ligne de code dans le fichier VistaFileDialog.cs
Dans la méthode internal virtual void SetDialogProperties(Ookii.Dialogs.Wpf.Interop.IFileDialog dialog)
changer ce morceau de code

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

à

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

Ça c'est fait.
Maintenant, la boîte de dialogue Ookii commencera dans la propriété InitialDirectory .

J'espère que cela pourrait aider.

@ gitjsdr26 vous pouvez créer un PR pour @augustoproiete

@nzain , désolé, je ne sais pas comment faire cela avec GitHub.

Ok, j'ai rassemblé quelques informations supplémentaires pour faire la lumière sur ce problème.

Nous parlons d'une propriété InitialDirectory comme celle documentée pour OpenFileDialog.InitialDirectory de WPF. La documentation dit:

Obtient ou définit le répertoire initial affiché par une boîte de dialogue de fichier.

Les utilisateurs d'Ookii Dialogs s'attendront au même comportement car la propriété porte le même nom. Je suis d'accord, dans de nombreuses situations, cette propriété ne doit pas être définie (bloc-notes, etc.), mais c'est une autre histoire. _Si_ la propriété est définie, elle devrait fonctionner comme prévu.

Le InitialDirectory ne doit pas être confondu avec IFileDialog::SetDefaultFolder qui est actuellement appelé. Ici, la documentation dit:

Définit le dossier utilisé par défaut si aucune valeur de dossier récemment utilisé n'est disponible.

Je ne sais pas si cela (aucun dossier récemment utilisé disponible) est jamais le cas. La définition du dossier par défaut n'a jamais eu d'effet pour moi. Si cette fonctionnalité est requise pour quelqu'un, elle devrait être disponible en tant que propriété DefaultDirectory . Il peut s'agir d'un artefact obsolète des temps anciens - si quelqu'un sait quand cela a un effet, veuillez me le faire savoir.

PR?

Le PR # 2 est ouvert depuis deux ans maintenant (!) Et suggère une chose similaire. Bien que l'auteur @buildcomplete mentionne qu'il fonctionne au moins une fois dans son scénario. Son correctif semble être basé sur l'ancien code, mais fait la même chose que @ gitjsdr26 suggère: changer l'appel
IFileDialog::SetDefaultFolder(...) à IFileDialog::SetFolder(...) .

Je ne veux pas perdre de temps avec la création de relations publiques (je changerais aussi cette seule ligne).

@augustoproiete s'il vous plaît laissez-nous savoir ce que vous en pensez :)

Cette page vous a été utile?
0 / 5 - 0 notes