W VS .NET, gdy wybierasz folder dla projektu, wyświetlane jest okno dialogowe wyglądające jak OpenFileDialog lub SaveFileDialog, ale skonfigurowane tak, aby akceptowało tylko foldery. Odkąd to widziałem, chciałem wiedzieć, jak to się robi. Jestem świadomy FolderBrowserDialog, ale tak naprawdę nigdy nie podobało mi się to okno dialogowe. Zaczyna się za mały i nie pozwala mi skorzystać z możliwości wpisania ścieżki.
Jestem już prawie pewien, że nie ma sposobu, aby to zrobić z .NET, ale jestem równie ciekawy, jak to zrobić z niezarządzanego kodu. Poza całkowitym ponownym wdrożeniem okna dialogowego od zera, jak zmodyfikować okno dialogowe, aby uzyskać takie zachowanie?
Chciałbym również powtórzyć, że znam FolderBrowserDialog, ale czasami nie lubię go używać, oprócz tego, że jestem naprawdę ciekawy, jak skonfigurować okno dialogowe w ten sposób. Mówienie mi, żebym po prostu użył FolderBrowserDialog, pomaga mi zachować spójność interfejsu użytkownika, ale nie zaspokaja mojej ciekawości, więc nie będzie liczony jako odpowiedź.
Nie jest to również kwestia specyficzna dla systemu Vista; Widzę to okno dialogowe od VS .NET 2003, więc jest możliwe do wykonania w Win2k i WinXP. Jest to w mniejszym stopniu pytanie „chcę wiedzieć, jak to zrobić poprawnie”, a bardziej „byłem ciekaw tego, odkąd po raz pierwszy chciałem to zrobić w VS 2003”. Rozumiem, że okno dialogowe plików Visty ma taką opcję, ale działa w XP, więc wiem, że zrobili coś, aby to zadziałało. Odpowiedzi specyficzne dla systemu Vista nie są odpowiedziami, ponieważ system Vista nie istnieje w kontekście pytań.
Aktualizacja: Jestem przyjmując odpowiedź Scott Wiśniewski, ponieważ chodzi o próbki roboczej, ale myślę, że Serge zasługuje na uznanie za wskazując na dostosowanie dialogowym (który jest wprawdzie paskudny z .NET, ale nie pracę) i Mark Ransom na zastanawianie się, że MS prawdopodobnie utworzył niestandardowe okno dialogowe dla tego zadania.
źródło
dialog.FileName = "Folder Selection"
ma byćdialog.FileName = "Folder Selection."
z końcowym okresem? w każdym razie nie mogę sprawić, aby działał w PowerShell po drugim kliknięciu przycisku „Otwórz”. Ciągle mówi, że plik nie został znaleziony, mimo że CheckFileExists jest podobno fałszywydialog.CheckFileExists = 0
zamiast false rozwiązał mój problemOdpowiedzi:
Mam okno dialogowe, które napisałem, o nazwie Okno dialogowe OpenFileOrFolder, które pozwala otworzyć folder lub plik.
Jeśli ustawisz wartość AcceptFiles na false, wówczas działa tylko w trybie akceptowania folderów.
Możesz pobrać źródło z GitHub tutaj
źródło
Możesz użyć FolderBrowserDialogEx - wielokrotnego użytku pochodnej wbudowanej FolderBrowserDialog. Ten pozwala na wpisanie ścieżki, nawet ścieżki UNC. Za jego pomocą możesz także wyszukiwać komputery lub drukarki. Działa tak jak wbudowany FBD, ale ... lepiej.
(EDYCJA: Powinienem zauważyć, że to okno dialogowe można ustawić, aby wybrać pliki lub foldery.)
Pełny kod źródłowy (jeden krótki moduł C #). Wolny. Licencja MS-Public.
Kod, aby go użyć:
źródło
Istnieje pakiet kodów Windows API. Ma wiele rzeczy związanych z powłoką, w tym
CommonOpenFileDialog
klasę (wMicrosoft.WindowsAPICodePack.Dialogs
przestrzeni nazw). To idealne rozwiązanie - zwykle otwarte okno dialogowe z wyświetlanymi tylko folderami.Oto przykład, jak z niego korzystać:
Niestety Microsoft nie wysyła już tego pakietu, ale kilka osób nieoficjalnie przesłało pliki binarne do NuGet. Jeden przykład można znaleźć tutaj . Ten pakiet jest przeznaczony tylko dla powłoki. W razie potrzeby ten sam użytkownik ma kilka innych pakietów, które oferują więcej funkcji obecnych w oryginalnym pakiecie.
źródło
Ookii.Dialogs pakiet zawiera zarządzanej otoki wokół nowego stylu (Vista) okna przeglądarki folderu. Zniszcza się również z wdziękiem na starszych systemach operacyjnych.
źródło
OpenFileDialog
dialogu w stylu folderu.Lepiej do tego użyć FolderBrowserDialog.
źródło
Po godzinach poszukiwań znalazłem tę odpowiedź przez leetNightShade do działającego rozwiązania .
Są trzy rzeczy, które moim zdaniem sprawiają, że to rozwiązanie jest znacznie lepsze niż wszystkie inne.
Pobierz kod tutaj .
źródło
Dokładna kopia audio działa w ten sposób w systemie Windows XP. Wyświetla się standardowe okno dialogowe otwierania pliku, ale pole nazwy pliku zawiera tekst „Nazwa pliku zostanie zignorowana”.
Zgaduję tutaj, ale podejrzewam, że ciąg jest wstrzykiwany do kontrolki edycji pola kombi za każdym razem, gdy wprowadzana jest znacząca zmiana w oknie dialogowym. Dopóki pole nie jest puste, a flagi okien dialogowych są ustawione tak, aby nie sprawdzały istnienia pliku, okno dialogowe można normalnie zamknąć.
Edycja: jest to o wiele łatwiejsze niż myślałem. Oto kod w C ++ / MFC, możesz przetłumaczyć go na wybrane środowisko.
Edycja 2: To powinno być tłumaczenie na C #, ale nie mówię biegle w C #, więc nie strzelaj do mnie, jeśli to nie działa.
Edycja 3: W końcu spojrzał na właściwe okno dialogowe w Visual Studio 2005 (wcześniej nie miałem do niego dostępu). To nie jest standardowe okno dialogowe otwierania pliku! Jeśli sprawdzisz okna w Spy ++ i porównasz je ze standardowym otwartym plikiem, zobaczysz, że struktura i nazwy klas nie pasują. Gdy przyjrzysz się uważnie, możesz również zauważyć pewne różnice między zawartością okien dialogowych. Doszedłem do wniosku, że Microsoft całkowicie zastąpił standardowe okno dialogowe w Visual Studio, aby nadać mu tę funkcję. Moje rozwiązanie lub coś podobnego będzie tak blisko, jak to tylko możliwe, chyba że zechcesz napisać kod od zera.
źródło
OK, pozwól mi spróbować połączyć pierwszą kropkę ;-) Trochę gry ze Spy ++ lub Winspector pokazuje, że pole tekstowe Folder w Lokalizacji projektu VS jest dostosowaniem standardowego okna dialogowego. To nie jest to samo pole, co pole tekstowe z nazwą pliku w standardowym oknie dialogowym pliku, takim jak to w Notatniku.
Odtąd, jak sądzę, VS ukrywa nazwę pliku i pola tekstowe / kombinacje pól tekstowych i używa niestandardowego szablonu okna dialogowego, aby dodać własną część na dole okna dialogowego.
EDYCJA: Oto przykład takiej modyfikacji i jak to zrobić (w Win32. Nie .NET):
m_ofn jest strukturą OPENFILENAME, która stanowi podstawę okna dialogowego pliku. Dodaj te 2 linie:
gdzie IDD_FILEDIALOG_IMPORTXLIFF to niestandardowy szablon okna dialogowego, który zostanie dodany w dolnej części okna dialogowego. Zobacz część w kolorze czerwonym poniżej. (źródło: apptranslator.com )
W takim przypadku dostosowana część jest tylko etykietą + hiperłączem, ale może to być dowolne okno dialogowe. Może zawierać przycisk OK, który pozwoliłby nam zweryfikować wybór tylko folderu.
Ale jak pozbyliśmy się niektórych elementów sterujących w standardowej części okna dialogowego, nie wiem.
Więcej szczegółów w tym artykule MSDN .
źródło
Możesz podklasować okno dialogowe pliku i uzyskać dostęp do wszystkich jego elementów sterujących. Każdy ma identyfikator, którego można użyć do uzyskania uchwytu okna. Następnie możesz je wyświetlać i ukrywać, otrzymywać od nich wiadomości o zmianach wyboru itp. Wszystko zależy od tego, ile wysiłku chcesz podjąć.
Skorzystaliśmy z obsługi klasy WTL i dostosowaliśmy okno dialogowe pliku, aby zawierało niestandardowy pasek miejsc i widoki COM wtyczki.
MSDN zawiera informacje o tym, jak to zrobić za pomocą Win32, ten artykuł CodeProject zawiera przykład , a ten artykuł CodeProject zawiera przykład .NET .
źródło
Możesz użyć takiego kodu
Aby zaawansować ukrywanie pola tekstowego dla nazwy pliku, musisz spojrzeć na OpenFileDialogEx
Kod:
źródło
Zakładam, że korzystasz z systemu Vista przy użyciu VS2008? W takim przypadku myślę, że przy wywołaniu okna dialogowego pliku Vista IFileDialog używana jest opcja FOS_PICKFOLDERS . Obawiam się, że w kodzie .NET wymagałoby to dużo niepoprawnego kodu interoperacji P / Invoke, aby mógł działać.
źródło
Pierwsze rozwiązanie
Opracowałem to jako oczyszczoną wersję okna wyboru folderów w stylu .NET Win 7 w stylu Billa Seddona z lyquidity.com (nie mam powiązania). (Dowiedziałem się o jego kodzie z innej odpowiedzi na tej stronie ). Napisałem własny, ponieważ jego rozwiązanie wymaga dodatkowej klasy Reflection, która nie jest potrzebna do tego ukierunkowanego celu, wykorzystuje kontrolę przepływu opartą na wyjątkach, nie buforuje wyników swoich wywołań refleksji. Zauważ, że zagnieżdżona
VistaDialog
klasa statyczna jest taka, że jej statyczne zmienne odbicia nie próbują zapełnić się, jeśliShow
metoda nigdy nie zostanie wywołana. Powraca do okna dialogowego sprzed Visty, jeśli nie jest w wystarczająco wysokiej wersji Windows. Powinien działać w Windows 7, 8, 9, 10 i wyższych (teoretycznie).Używa się go tak jak w formularzu Windows:
Możesz oczywiście bawić się z jego opcjami i właściwościami, które ujawnia. Na przykład umożliwia wielokrotne wybieranie w oknie dialogowym w stylu Vista.
Drugie rozwiązanie
Simon Mourier udzielił odpowiedzi, która pokazuje, jak wykonać dokładnie to samo zadanie, używając bezpośrednio interfejsu API systemu Windows, chociaż jego wersja musiałaby zostać uzupełniona, aby używać starszego stylu okna dialogowego, jeśli jest w starszej wersji systemu Windows. Niestety nie znalazłem jeszcze jego posta, gdy opracowałem swoje rozwiązanie. Nazwij swoją truciznę!
źródło
Wypróbuj ten z Codeproject (kredyt dla Nitron):
Myślę, że mówisz o tym samym oknie dialogowym - może pomogłoby Ci to, jeśli dodasz zrzut ekranu?
źródło
W systemie Vista można używać IFileDialog z zestawem opcji FOS_PICKFOLDERS. Spowoduje to wyświetlenie okna podobnego do OpenFileDialog, w którym możesz wybrać foldery:
W starszych wersjach systemu Windows zawsze możesz zastosować trick, wybierając dowolny plik w folderze.
Przykład działania, który działa na .NET Framework 2.0 i nowszych, można znaleźć tutaj .
źródło
Możesz użyć takiego kodu
Filtr jest pustym ciągiem. Nazwa pliku to AnyName, ale nie jest pusta
źródło
Ookii Dialogi dla WPF biblioteki ma klasę, która zapewnia realizację oknie przeglądarki folder dla WPF.
Istnieje również wersja współpracująca z Windows Forms .
źródło
Wiem, że pytanie dotyczyło konfiguracji,
OpenFileDialog
ale widząc, że Google mnie tu przywiodło, mogę również zauważyć, że jeśli TYLKO szukasz folderów, powinieneś użyćFolderBrowserDialog
Zamiast tego, jak odpowiedziałem inne SO pytanie poniżejJak określić ścieżkę za pomocą okna dialogowego Otwórz plik w vb.net?
źródło