Dalam VS. NET, ketika Anda memilih folder untuk proyek, dialog yang terlihat seperti OpenFileDialog atau SaveFileDialog ditampilkan, tetapi diatur untuk menerima folder saja. Sejak saya melihat ini, saya ingin tahu bagaimana melakukannya. Saya mengetahui FolderBrowserDialog, tetapi saya tidak pernah benar-benar menyukai dialog itu. Itu dimulai terlalu kecil dan tidak membiarkan saya mengambil keuntungan dari bisa mengetikkan path.
Saya hampir yakin sekarang tidak ada cara untuk melakukan ini dari .NET, tapi saya juga ingin tahu bagaimana Anda melakukannya dari kode yang tidak dikelola juga. Singkat untuk sepenuhnya menerapkan kembali dialog dari awal, bagaimana Anda memodifikasi dialog untuk memiliki perilaku ini?
Saya juga ingin menyatakan kembali bahwa saya mengetahui FolderBrowserDialog tetapi kadang-kadang saya tidak suka menggunakannya, selain menjadi benar-benar penasaran bagaimana mengkonfigurasi dialog dengan cara ini. Memberitahu saya untuk hanya menggunakan FolderBrowserDialog membantu saya mempertahankan pengalaman UI yang konsisten tetapi tidak memuaskan rasa ingin tahu saya sehingga tidak akan dihitung sebagai jawaban.
Ini bukan hal yang khusus untuk Vista; Saya telah melihat dialog ini sejak VS .NET 2003, jadi itu bisa dilakukan di Win2k dan WinXP. Ini kurang dari pertanyaan "Saya ingin tahu cara yang tepat untuk melakukan ini" dan lebih dari "Saya ingin tahu tentang ini sejak saya pertama kali ingin melakukannya dalam VS 2003" pertanyaan. Saya mengerti bahwa dialog file Vista memiliki opsi untuk melakukan ini, tetapi sudah berfungsi di XP jadi saya tahu mereka melakukan sesuatu untuk membuatnya berfungsi. Jawaban khusus-Vista bukan jawaban, karena Vista tidak ada dalam konteks pertanyaan.
Update: Saya menerima jawaban Scott Wisniewski ini karena dilengkapi dengan sampel bekerja, tapi saya pikir Serge pantas kredit untuk menunjuk ke kustomisasi dialog (yang diakui jahat dari NET tetapi tidak bekerja) dan Mark Ransom untuk mencari tahu bahwa MS mungkin menggulung dialog khusus untuk tugas ini.
sumber
dialog.FileName = "Folder Selection"
seharusnyadialog.FileName = "Folder Selection."
dengan periode trailing? Lagi pula saya tidak bisa membuatnya bekerja di PowerShell pada klik kedua "Open". Itu terus mengatakan file tidak ditemukan, meskipun CheckFileExists diduga palsudialog.CheckFileExists = 0
bukannya false memecahkan masalah sayaJawaban:
Saya memiliki dialog yang saya tulis disebut dialog OpenFileOrFolder yang memungkinkan Anda untuk membuka folder atau file.
Jika Anda menetapkan nilai AcceptFiles ke false, maka itu beroperasi hanya dalam menerima mode folder.
Anda dapat mengunduh sumbernya dari GitHub di sini
sumber
Anda dapat menggunakan FolderBrowserDialogEx - turunan yang dapat digunakan kembali dari FolderBrowserDialog bawaan. Yang ini memungkinkan Anda untuk mengetik lintasan, bahkan lintasan UNC. Anda juga dapat menelusuri komputer atau printer dengan itu. Bekerja seperti FBD bawaan, tapi ... lebih baik.
(EDIT: Saya seharusnya menunjukkan bahwa dialog ini dapat diatur untuk memilih file atau folder.)
Kode Sumber lengkap (satu modul C # pendek). Gratis. Lisensi MS-Publik.
Kode untuk menggunakannya:
sumber
Ada Paket Kode API Windows. Ada banyak hal yang berhubungan dengan shell, termasuk
CommonOpenFileDialog
kelas (diMicrosoft.WindowsAPICodePack.Dialogs
namespace). Ini adalah solusi sempurna - dialog terbuka biasa dengan hanya folder yang ditampilkan.Berikut adalah contoh cara menggunakannya:
Sayangnya Microsoft tidak lagi mengirimkan paket ini, tetapi beberapa orang telah mengunggah binari secara tidak resmi ke NuGet. Salah satu contoh dapat ditemukan di sini . Paket ini hanya untuk hal-hal khusus shell. Jika Anda membutuhkannya, pengguna yang sama memiliki beberapa paket lain yang menawarkan lebih banyak fungsi yang ada dalam paket aslinya.
sumber
The Ookii.Dialogs paket berisi pembungkus dikelola sekitar baru (Vista-gaya) folder dialog browser. Ini juga terdegradasi dengan anggun pada sistem operasi lama.
sumber
OpenFileDialog
dialog folder gaya.Lebih baik menggunakan FolderBrowserDialog untuk itu.
sumber
Setelah berjam-jam mencari saya menemukan jawaban ini dengan leetNightShade ke solusi yang berfungsi .
Ada tiga hal yang saya percaya membuat solusi ini jauh lebih baik daripada yang lainnya.
Unduh kodenya di sini .
sumber
Salinan Audio yang Tepat berfungsi seperti ini di Windows XP. Dialog terbuka file standar ditampilkan, tetapi bidang nama file berisi teks "Nama file akan diabaikan".
Hanya menebak-nebak di sini, tapi saya curiga string tersebut disuntikkan ke kontrol edit kotak kombo setiap kali ada perubahan signifikan pada dialog. Selama isian tidak kosong, dan bendera dialog ditetapkan untuk tidak memeriksa keberadaan file, dialog dapat ditutup secara normal.
Sunting: ini jauh lebih mudah dari yang saya kira. Berikut kode dalam C ++ / MFC, Anda dapat menerjemahkannya ke lingkungan pilihan Anda.
Sunting 2: Ini seharusnya terjemahan ke C #, tapi saya tidak lancar dalam C # jadi jangan tembak saya jika tidak berhasil.
Sunting 3: Akhirnya melihat dialog aktual yang dimaksud, dalam Visual Studio 2005 (saya tidak memiliki akses ke sana sebelumnya). Ini bukan dialog buka file standar! Jika Anda memeriksa windows di Spy ++ dan membandingkannya dengan file standar terbuka, Anda akan melihat bahwa struktur dan nama kelas tidak cocok. Ketika Anda melihat dari dekat, Anda juga dapat menemukan beberapa perbedaan antara isi dialog. Kesimpulan saya adalah bahwa Microsoft sepenuhnya menggantikan dialog standar di Visual Studio untuk memberikannya kemampuan ini. Solusi saya atau yang serupa akan sedekat yang Anda bisa, kecuali jika Anda mau membuat kode sendiri dari awal.
sumber
OK, izinkan saya mencoba menghubungkan titik pertama ;-) Bermain sedikit dengan Spy ++ atau Winspector menunjukkan bahwa kotak teks Folder di Lokasi Proyek VS adalah kustomisasi dari dialog standar. Ini bukan bidang yang sama dengan kotak nama file dalam dialog file standar seperti yang ada di Notepad.
Dari sana, saya pikir, VS menyembunyikan nama file dan tipe kotak teks / kotak kombo dan menggunakan templat dialog kustom untuk menambahkan bagiannya sendiri di bagian bawah dialog.
EDIT: Berikut adalah contoh penyesuaian seperti itu dan bagaimana melakukannya (di Win32. Not .NET):
m_ofn adalah struct OPENFILENAME yang mendasari dialog file. Tambahkan 2 baris ini:
di mana IDD_FILEDIALOG_IMPORTXLIFF adalah templat dialog khusus yang akan ditambahkan di bagian bawah dialog. Lihat bagian merah di bawah. (sumber: apptranslator.com )
Dalam hal ini, bagian yang dikustomisasi hanya label + hyperlink tetapi bisa berupa dialog apa pun. Itu bisa berisi tombol OK yang memungkinkan kita memvalidasi pemilihan folder saja.
Tapi bagaimana kita bisa menghilangkan beberapa kontrol di bagian standar dialog, saya tidak tahu.
Lebih detail dalam artikel MSDN ini .
sumber
Anda dapat mensubklasifikasikan file dialog dan mendapatkan akses ke semua kontrolnya. Masing-masing memiliki pengenal yang dapat digunakan untuk mendapatkan pegangan jendela. Anda kemudian dapat menunjukkan dan menyembunyikannya, mendapatkan pesan dari mereka tentang perubahan pilihan dll. Dll. Itu semua tergantung berapa banyak upaya yang ingin Anda ambil.
Kami melakukannya dengan menggunakan dukungan kelas WTL dan mengkustomisasi dialog file untuk menyertakan bilah tempat khusus dan tampilan COM plug-in.
MSDN menyediakan informasi tentang cara melakukan ini menggunakan Win32, artikel CodeProject ini mencakup contoh , dan artikel CodeProject ini memberikan contoh .NET .
sumber
Anda dapat menggunakan kode seperti ini
Untuk menyembunyikan textbox untuk nama file, Anda perlu melihat OpenFileDialogEx
Kode:
sumber
Saya berasumsi Anda menggunakan Vista menggunakan VS2008? Dalam hal ini saya berpikir bahwa opsi FOS_PICKFOLDERS digunakan ketika memanggil dialog file Vista IFileDialog . Saya khawatir bahwa dalam kode .NET ini akan melibatkan banyak kode interop P / Invoke untuk bekerja.
sumber
Solusi Pertama
Saya mengembangkan ini sebagai versi bersih dari .NET Win 7-style folder pilih dialog oleh Bill Seddon dari lyquidity.com (Saya tidak punya afiliasi). (Saya mengetahui kodenya dari jawaban lain di halaman ini ). Saya menulis sendiri karena solusinya memerlukan kelas Refleksi tambahan yang tidak diperlukan untuk tujuan terfokus ini, menggunakan kontrol aliran berbasis pengecualian, tidak men-cache hasil panggilan refleksinya. Perhatikan bahwa
VistaDialog
kelas statis bersarang adalah agar variabel refleksi statisnya tidak mencoba untuk dipopulasi jikaShow
metode ini tidak pernah dipanggil. Itu jatuh kembali ke dialog pra-Vista jika tidak dalam versi Windows yang cukup tinggi. Harus bekerja di Windows 7, 8, 9, 10 dan lebih tinggi (secara teoritis).Ini digunakan seperti pada Formulir Windows:
Tentu saja Anda bisa bermain-main dengan opsi dan properti apa yang terpapar. Misalnya, ini memungkinkan multiselect di dialog gaya Vista.
Solusi Kedua
Simon Mourier memberikan jawaban yang menunjukkan bagaimana melakukan pekerjaan yang sama persis menggunakan interop terhadap API Windows secara langsung, meskipun versinya harus ditambahkan untuk menggunakan dialog gaya lama jika dalam versi Windows yang lebih lama. Sayangnya, saya belum menemukan posnya ketika saya mengerjakan solusi saya. Namai racunmu!
sumber
Coba yang ini dari Codeproject (kredit ke Nitron):
Saya pikir ini dialog yang sama dengan yang Anda bicarakan - mungkin akan membantu jika Anda menambahkan tangkapan layar?
sumber
Pada Vista Anda dapat menggunakan IFileDialog dengan opsi FOS_PICKFOLDERS yang disetel. Itu akan menyebabkan tampilan jendela seperti OpenFileDialog di mana Anda dapat memilih folder:
Untuk Windows yang lebih lama, Anda selalu dapat melakukan trik dengan memilih file apa pun di folder.
Contoh kerja yang berfungsi pada .NET Framework 2.0 dan yang lebih baru dapat ditemukan di sini .
sumber
Anda dapat menggunakan kode seperti ini
Filter adalah string kosong. Nama file adalah AnyName tetapi tidak kosong
sumber
The Ookii Dialog untuk WPF perpustakaan memiliki kelas yang menyediakan implementasi dari dialog browser folder untuk WPF.
Ada juga versi yang berfungsi dengan Windows Forms .
sumber
Saya tahu pertanyaannya adalah pada konfigurasi
OpenFileDialog
tetapi melihat bahwa Google membawa saya ke sini saya mungkin juga menunjukkan bahwa jika Anda HANYA mencari folder, Anda harus menggunakanFolderBrowserDialog
Sebaliknya sebagai dijawab oleh pertanyaan SO lain di bawah iniBagaimana cara menentukan jalur menggunakan dialog file terbuka di vb.net?
sumber