Chcę, aby użytkownik wybrał katalog, w którym zapisany zostanie plik, który wygeneruję. Wiem, że w WPF powinienem używać OpenFileDialog
z Win32, ale niestety okno dialogowe wymaga wybrania pliku (plików) - pozostaje otwarty, jeśli po prostu kliknę OK bez wybierania jednego. Mógłbym „zhakować” funkcjonalność, pozwalając użytkownikowi wybrać plik, a następnie usunąć ścieżkę, aby dowiedzieć się, do którego katalogu należy, ale w najlepszym razie jest to nieintuicyjne. Czy ktoś widział to wcześniej?
wpf
filesystems
dialog
Alexandra
źródło
źródło
Odpowiedzi:
W tym celu można użyć wbudowanej klasy FolderBrowserDialog . Nie przejmuj się, że jest w
System.Windows.Forms
przestrzeni nazw.Jeśli chcesz, aby okno było modalne w niektórych oknach WPF, zobacz pytanie Jak korzystać z FolderBrowserDialog z aplikacji WPF .
EDYCJA: Jeśli chcesz czegoś bardziej fantazyjnego niż zwykły, brzydki folder Windows Forms FolderBrowserDialog, istnieje kilka alternatyw, które pozwalają na korzystanie z okna dialogowego Vista:
Windows API Code Pack-Shell :
Pamiętaj, że to okno dialogowe nie jest dostępne w systemach operacyjnych starszych niż Windows Vista, więc
CommonFileDialog.IsPlatformSupported
najpierw sprawdź .źródło
CommonOpenFileDialog
zWindowsAPICodePack
ciebie, musiszInstall-Package WindowsAPICodePack-Shell
. Link podany w odpowiedzi nie zawiera tego.Utworzyłem UserControl, który jest używany w następujący sposób:
Źródło xaml wygląda następująco:
i kod
źródło
be.UpdateSource
? Czy zmiany powiadomień nie powinny być automatyczne we właściwościach zależności?Używam Ookii dialogi na chwilę i to działa miły dla WPF.
Oto bezpośrednia strona:
http://www.ookii.org/Blog/new_download_ookiidialogs
źródło
Okno dialogowe folderu Ookii można znaleźć w Nuget.
PM> Install-Package Ookii.Dialogs
I przykładowy kod jest jak poniżej.
źródło
Dla tych, którzy nie chcą tworzyć niestandardowego okna dialogowego, ale nadal wolą 100% sposób WPF i nie chcą używać oddzielnych plików DDL, dodatkowych zależności lub przestarzałych interfejsów API, wpadłem na bardzo prosty hack przy użyciu okna dialogowego Zapisz jako.
Nie wymaga użycia dyrektywy, możesz po prostu skopiować i wkleić poniższy kod!
Powinien nadal być bardzo przyjazny dla użytkownika i większość ludzi nigdy tego nie zauważy.
Pomysł wynika z tego, że możemy łatwo zmienić tytuł tego okna dialogowego, ukryć pliki i obejść wynikową nazwę pliku.
Z pewnością jest to duży hack, ale może zrobi to dobrze dla twojego użytku ...
W tym przykładzie mam obiekt pola tekstowego, który zawiera ścieżkę wynikową, ale możesz usunąć powiązane linie i użyć wartości zwracanej, jeśli chcesz ...
Jedyne problemy z tym hackiem to:
Większość ludzi tego nie zauważy, chociaż zdecydowanie wolałbym użyć oficjalnego sposobu WPF, jeśli Microsoft straci głowę z tyłków, ale dopóki tego nie zrobią, to moja tymczasowa poprawka.
źródło
Aby okno dialogowe katalogu otrzymało ścieżkę katalogu, najpierw dodaj odniesienie System.Windows.Forms, a następnie Resolve, a następnie umieść ten kod jednym kliknięciem przycisku.
(folderpathTB to nazwa TextBox, w której chcę wstawić ścieżkę folderu, LUB możesz też przypisać ją do zmiennej łańcuchowej, tj.)
A jeśli chcesz uzyskać nazwę pliku / ścieżkę, po prostu zrób to za pomocą przycisku kliknięcia
(folderpathTB to nazwa TextBox, w której chcę wstawić ścieżkę pliku, LUB możesz też przypisać ją do zmiennej łańcuchowej)
Uwaga: W przypadku okna dialogowego folderu do projektu należy dodać plik System.Windows.Forms.dll, w przeciwnym razie nie zadziałałby.
źródło
Znalazłem poniższy kod na poniższym linku ... i działało Wybierz okno dialogowe folderu WPF
źródło
Najlepszym sposobem na osiągnięcie tego, co chcesz, jest utworzenie własnej kontroli opartej na WPF lub użycie takiej, która została stworzona przez innych ludzi,
dlaczego? ponieważ będzie zauważalny wpływ na wydajność podczas korzystania z okna dialogowego winforms w aplikacji wpf (z jakiegoś powodu)
polecam ten projekt
https://opendialog.codeplex.com/
lub Nuget:
jest bardzo przyjazny dla MVVM i nie zawija okna dialogowego winforms
źródło
Sugeruję, aby dodać w pakiecie samorodek:
Zatem sposobem na to jest:
Oto dokumentacja: http://opendialog.codeplex.com/documentation
Działa z plikami, plikami z filtrem, folderami itp
źródło
Ookii
VistaFolderBrowserDialog
jest tym, czego chcesz.Jeśli chcesz tylko przeglądarkę folderów z Ooki Dialogs i nic więcej, pobierz Źródło , wybierz pliki potrzebne do przeglądarki folderów (wskazówka: 7 plików) i będzie dobrze działać w .NET 4.5.2. Musiałem dodać odniesienie do
System.Drawing
. Porównaj odniesienia w oryginalnym projekcie do swojego.Jak ustalić, które pliki? Otwórz aplikację i Ookii w różnych instancjach Visual Studio. Dodaj
VistaFolderBrowserDialog.cs
do aplikacji i kontynuuj dodawanie plików, aż błędy kompilacji znikną. Zależności można znaleźć w projekcie Ookii - kliknij z wciśniętym klawiszem Control w tę, z której chcesz wrócić do źródła (zamierzona gra słów).Oto pliki, których potrzebujesz, jeśli jesteś zbyt leniwy, aby to zrobić ...
Edytuj wiersz 197,
VistaFolderBrowserDialog.cs
chyba że chcesz dołączyć ichResources.Resx
wyrzuć nowy InvalidOperationException (Properties.Resources.FolderBrowserDialogNoRootFolder);Dodaj informację o prawach autorskich do swojej aplikacji zgodnie z ich
license.txt
Kod w
\Ookii.Dialogs.Wpf.Sample\MainWindow.xaml.cs
linii 160-169 jest przykładem, którego możesz użyć, ale będziesz musiał go usunąćthis,
zMessageBox.Show(this,
WPF.Działa na mojej maszynie [TM]
źródło
Wiem, że to stare pytanie, ale prostym sposobem na to jest skorzystanie z opcji FileDialog dostarczonej przez WPF i użycie System.IO.Path.GetDirectory (nazwa pliku).
źródło
Żadna z tych odpowiedzi nie działała dla mnie (ogólnie brakowało referencji lub coś podobnego)
Ale to po prostu:
Korzystanie z FolderBrowserDialog w aplikacji WPF
Dodaj odwołanie do
System.Windows.Forms
i użyj tego kodu:Nie musisz szukać brakujących pakietów. Lub dodaj ogromne klasy
Daje mi to nowoczesny selektor folderów, który umożliwia także utworzenie nowego folderu
Jeszcze nie widzę wpływu po wdrożeniu na innych komputerach
źródło
Możesz użyć czegoś takiego w WPF. Stworzyłem przykładową metodę. Sprawdź poniżej.
źródło