Ookii-dialogs-wpf: VistaOpenFileDialog.InitialDirectory akan diabaikan

Dibuat pada 26 Sep 2019  ·  9Komentar  ·  Sumber: ookii-dialogs/ookii-dialogs-wpf

Menginisialisasi dialog dengan properti InitialDirectory yang disetel ke folder lokal dan sudah ada akan diabaikan.
Dialog selalu menampilkan folder terakhir tempat file dibuka.

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

Perilaku yang diharapkan:
VistaOpenFileDialog selalu mengatur konten C: \ ketika InitialDirectory diatur ke "C: \".

Windows 10 Pro 1903 / .Net Framework 4.6

good first issue hacktoberfest help wanted needs-design

Komentar yang paling membantu

Memang benar bahwa banyak aplikasi windows memiliki perilaku default "pintar" untuk mengingat jalur terakhir Anda, ada banyak situasi di mana pengembang aplikasi ingin menentukan direktori awal tertentu untuk membantu pengguna. Untuk lanskap aplikasi kami, ini bahkan merupakan perilaku default, karena pengguna kami berharap untuk memuat dari / menyimpan ke direktori terkait proyek tertentu. Menggunakan direktori terakhir "pintar" dari notepad / paint / word mengganggu dan tidak berguna di sini.

Plus: Microsoft.Win32.OpenFileDialog memiliki properti yang sama persis dan menggunakannya seperti yang diharapkan.

Semua 9 komentar

Terima kasih telah melaporkan @soulflyman. Namun, saya yakin ini adalah perilaku yang "benar" karena cocok dengan apa yang terjadi di semua aplikasi lain yang disertakan dengan Windows - yaitu Mereka mengingat folder terakhir yang digunakan.

Anda harus dapat mereproduksi hal yang sama dengan Notepad atau Paint.

@buildcomplete melaporkan masalah yang sama dengan PR # 2 jadi mungkin kami memerlukan cara untuk menimpa perilaku ini (?), idealnya sebagai pengaturan keikutsertaan yang tidak memperkenalkan perubahan yang dapat menyebabkan gangguan.

Kedengarannya bagus, saya akan baik-baik saja dengan pengaturan baru seperti yang Anda sebutkan.

Saya mengetahui perilaku default (seperti notepad) tetapi saya mengharapkan perilaku ini berubah ketika InitialDirectory diatur secara manual.
Asumsi saya adalah bahwa InitialDirectory dimaksudkan sebagai direktori yang ditampilkan setiap kali dialog ditampilkan atau setidaknya dalam contoh aplikasi yang sedang berjalan ini. Saya tidak berharap untuk diabaikan bahkan setelah menutup dan memulai ulang aplikasi.

Saya mengalami masalah yang sama.
Bereksperimen dengan berbagai cara / urutan pengaturan berbagai properti VistaSaveFileDialog tidak berhasil. Dialog selalu mengabaikan pengaturan InitialDirectoy dan menggunakan default.

Saya mengonfirmasi bahwa '_initialDirectory' disetel ke jalur yang saya inginkan di VistaFileDialog.cs.
Dari sana, nilainya menuju CreateItemFromParsingName(string path) di NativeMethods.cs, dan kemudian menghilang ke lubang 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;
 }

Metode SHCreateItemFromParsingName tampaknya gagal, karena objek COM yang dikembalikan tampaknya null?

CreateItemFromParsingName

Saya menambahkan SetLastError = true ke tanda tangan metode dan mencoba Marshal.GetLastWin32Error() setelah panggilan, tetapi mengembalikan 0.

Memang benar bahwa banyak aplikasi windows memiliki perilaku default "pintar" untuk mengingat jalur terakhir Anda, ada banyak situasi di mana pengembang aplikasi ingin menentukan direktori awal tertentu untuk membantu pengguna. Untuk lanskap aplikasi kami, ini bahkan merupakan perilaku default, karena pengguna kami berharap untuk memuat dari / menyimpan ke direktori terkait proyek tertentu. Menggunakan direktori terakhir "pintar" dari notepad / paint / word mengganggu dan tidak berguna di sini.

Plus: Microsoft.Win32.OpenFileDialog memiliki properti yang sama persis dan menggunakannya seperti yang diharapkan.

Saya memiliki kebutuhan yang sama.
Bisakah Anda menambahkan pengaturan yang memungkinkan untuk mengatur direktori awal kotak Dialog?
Terima kasih.

Saya masuk ke kode perpustakaan Ookii. kemudian saya menemukan cara memperhitungkan properti InitialDirectory .
Anda harus mengubah baris kode ini menjadi file VistaFileDialog.cs
Ke metode internal virtual void SetDialogProperties(Ookii.Dialogs.Wpf.Interop.IFileDialog dialog)
ubah bagian kode ini

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

untuk

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

Itu selesai.
Sekarang dialog Ookii akan mulai menjadi properti InitialDirectory .

Semoga bisa membantu.

@ gitjsdr26 Anda dapat membuat PR untuk @augustoproiete

@ nzain , maaf saya tidak tahu bagaimana melakukan ini dengan GitHub.

Oke, saya telah mengumpulkan beberapa informasi lagi untuk menjelaskan masalah ini.

Kita berbicara tentang properti InitialDirectory seperti yang didokumentasikan untuk OpenFileDialog.InitialDirectory WPF. Dokumentasinya mengatakan:

Mendapat atau menetapkan direktori awal yang ditampilkan oleh dialog file.

Pengguna Ookii Dialogs akan mengharapkan perilaku yang sama karena properti tersebut memiliki nama yang sama. Saya setuju, dalam banyak situasi, properti ini tidak boleh disetel (notepad, dll.), Tetapi itu adalah cerita yang berbeda. _Jika_ properti disetel, itu harus berfungsi seperti yang diharapkan.

InitialDirectory jangan disamakan dengan IFileDialog::SetDefaultFolder yang saat ini disebut. Di sini dokumentasinya mengatakan:

Menetapkan folder yang digunakan sebagai default jika tidak tersedia nilai folder yang baru-baru ini digunakan.

Saya tidak yakin apakah ini (tidak tersedia folder yang baru-baru ini digunakan) yang pernah terjadi. Menyetel folder default tidak pernah berpengaruh apa pun bagi saya. Jika fungsionalitas itu diperlukan untuk siapa saja, itu harus tersedia sebagai properti DefaultDirectory . Ini mungkin artefak usang di masa lalu - jika ada yang tahu kapan ini berpengaruh, beri tahu saya.

PR?

PR # 2 terbuka selama dua tahun sekarang (!) Dan menyarankan hal serupa. Meskipun penulis @buildcomplete menyebutkan bahwa itu berfungsi setidaknya sekali dalam skenarionya. Perbaikannya tampaknya didasarkan pada kode lama, tetapi melakukan hal yang sama seperti yang disarankan @ gitjsdr26 : ubah panggilan
IFileDialog::SetDefaultFolder(...) hingga IFileDialog::SetFolder(...) .

Saya tidak ingin membuang waktu dengan pembuatan PR (saya akan mengubah satu baris ini juga).

@augustoproiete tolong beri tahu kami pendapat Anda tentang ini :)

Apakah halaman ini membantu?
0 / 5 - 0 peringkat