Okno dialogowe Otwórz katalog


Chcę, aby użytkownik wybrał katalog, w którym plik zostanie zapisany, który następnie utworzę. Wiem, że w WPF muszę używać
OpenFileDialog
z Win32, ale niestety okno dialogowe wymaga wybrania pliku (i) - pozostaje otwarte, jeśli kliknę OK bez wybierania żadnego. Mogę „zhakować” funkcjonalność, pozwalając użytkownikowi wybrać plik, a następnie wyczyścić ścieżkę, aby dowiedzieć się, do którego katalogu należy, ale w najlepszym przypadku jest to nieintuicyjne. Czy ktoś to widział wcześniej?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby to zrobić, możesz użyć wbudowanej klasy

FolderBrowserDialog
http://msdn.microsoft.com/en-u ... px... Nieważne, że znajduje się on w przestrzeni nazw
System.Windows.Forms
.
using (var dialog = new System.Windows.Forms.FolderBrowserDialog())
{
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
}

Jeśli chcesz, aby okno było modalne w odniesieniu do jakiegoś okna WPF, zobacz pytanie na

jak korzystać z FolderBrowserDialog z poziomu aplikacji
https://coderoad.ru/315164/
WPF .

EDIT:

Jeśli chcesz czegoś bardziej dziwacznego niż proste, brzydkie formularze Windows FolderBrowserDialog, istnieje kilka alternatyw, które pozwalają zamiast tego użyć okna dialogowego Vista:
  • Biblioteki stron trzecich, takie jak Dialogi Ookii http://www.ookii.org/software/dialogs/ (.NET 3.5)
  • W Kod powłoki pakietu interfejsu API systemu Windows https://www.nuget.org/packages ... Shell :
    using Microsoft.WindowsAPICodePack.Dialogs;...var dialog = new CommonOpenFileDialog();dialog.IsFolderPicker = true;CommonFileDialogResult result = dialog.ShowDialog();
    Zauważ, że to okno dialogowe nie jest dostępne w systemach operacyjnych starszych niż Windows Vista, więc najpierw sprawdź
    CommonFileDialog.IsPlatformSupported
    .
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Utworzyłem UserControl, który jest używany w następujący sposób:
<UtilitiesWPF:FolderEntry Text="{Binding Path=LogFolder}" Description="Folder for log files"/>

Źródło XAML wygląda następująco:
<UserControl x:Class="Utilities.WPF.FolderEntry"
xmlns="[url=http://schemas.microsoft.com/winfx/2006/xaml/presentation"]http://schemas.microsoft.com/w ... ot%3B[/url]
xmlns:x="[url=http://schemas.microsoft.com/winfx/2006/xaml">]http://schemas.microsoft.com/w ... gt%3B[/url]
<DockPanel>
<Button Margin="0" Padding="0" DockPanel.Dock="Right" Width="Auto" Click="BrowseFolder">...</Button>
<TextBox Height="Auto" HorizontalAlignment="Stretch" DockPanel.Dock="Right"
Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"/>
</DockPanel>
</UserControl>

i kod
public partial class FolderEntry {
public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(FolderEntry), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public static DependencyProperty DescriptionProperty = DependencyProperty.Register("Description", typeof(string), typeof(FolderEntry), new PropertyMetadata(null)); public string Text { get { return GetValue(TextProperty) as string; } set { SetValue(TextProperty, value); }} public string Description { get { return GetValue(DescriptionProperty) as string; } set { SetValue(DescriptionProperty, value); } } public FolderEntry() { InitializeComponent(); } private void BrowseFolder(object sender, RoutedEventArgs e) {
using (FolderBrowserDialog dlg = new FolderBrowserDialog()) {
dlg.Description = Description;
dlg.SelectedPath = Text;
dlg.ShowNewFolderButton = true;
DialogResult result = dlg.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK) {
Text = dlg.SelectedPath;
BindingExpression be = GetBindingExpression(TextProperty);
if (be != null)
be.UpdateSource();
}
}
}
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Okno dialogowe folderu Ookii można znaleźć pod adresem Nuget.
PM> Install-Package Ookii.Dialogs
I przykładowy kod, jak pokazano poniżej.
var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog();
if (dialog.ShowDialog(this).GetValueOrDefault())
{
textBoxFolderPath.Text = dialog.SelectedPath;
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

używam

Dialogi Ookii
http://www.ookii.org/
przez chwilę i działa dobrze w przypadku WPF.
Oto prosta strona:
http://www.ookii.org/Blog/new_ ... alogs
http://www.ookii.org/Blog/new_ ... alogs
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dla tych, którzy nie chcą tworzyć niestandardowego okna dialogowego, ale nadal preferują sposób w 100% WPF i nie chcą używać oddzielnych DDL, dodatkowych zależności ani starszych interfejsów API, wymyśliłem bardzo prosty hack za pomocą okna dialogowego Zapisz jako .
Nie ma potrzeby używania dyrektywy, wystarczy skopiować i wkleić poniższy kod!
Powinien być nadal bardzo przyjazny dla użytkownika i większość ludzi nigdy tego nie zauważy.
Chodzi o to, że możemy łatwo zmienić tytuł tego okna dialogowego, ukryć pliki i ominąć wynikową nazwę pliku.
To z pewnością duży hack, ale może zrobi to dobrze do twojego użytku ...
W tym przykładzie mam obiekt Textbox zawierający wynikową ścieżkę, ale możesz usunąć powiązane linie i użyć wartości zwracanej, jeśli chcesz ...
// Create a "Save As" dialog for selecting a directory (HACK)
var dialog = new Microsoft.Win32.SaveFileDialog();
dialog.InitialDirectory = textbox.Text;// Use current value for initial dir
dialog.Title = "Select a Directory";// instead of default "Save As"
dialog.Filter = "Directory|*.this.directory";// Prevents displaying files
dialog.FileName = "select";// Filename will then be "select.this.directory"
if (dialog.ShowDialog() == true) {
string path = dialog.FileName;
// Remove fake filename from resulting path
path = path.Replace("\\select.this.directory", "");
path = path.Replace(".this.directory", "");
// If user has changed the filename, create the new directory
if (!System.IO.Directory.Exists(path)) {
System.IO.Directory.CreateDirectory(path);
}
// Our final value is in path
textbox.Text = path;
}

Jedyne problemy z tym hackiem to:
  • Przycisk potwierdzenia nadal mówi „Zapisz” zamiast czegoś w rodzaju „Wybierz katalog”, ale w przypadku takim jak kopalnie I „Zapisz”, wybór katalogu nadal działa ...
  • Pole wejściowe nadal zawiera tekst „Nazwa pliku” zamiast „nazwa katalogu”, ale możemy powiedzieć, że katalog jest typem pliku ...
  • Jest też menu „Zapisz jako typ”, ale jego wartość to „Katalog (* .this.directory)” i użytkownik nie może go zmienić na coś innego, działa dla mnie ...

Większość ludzi tego nie zauważy, chociaż zdecydowanie wolałbym użyć oficjalnego sposobu WPF, gdyby Microsoft wyciągnął im głowy z tyłka, ale dopóki tego nie zrobią, to jest moje obejście.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Aby okno dialogowe katalogu mogło pobrać ścieżkę do katalogu, najpierw dodaj odwołanie System.Windows.Forms, a następnie zezwól, a następnie umieść ten kod w przycisku click.
var dialog = new FolderBrowserDialog();
dialog.ShowDialog();
folderpathTB.Text = dialog.SelectedPath;

(folderpathTB to nazwa TextBox, w którym chcę umieścić ścieżkę folderu, LUB u możesz przypisać ją również do zmiennej ciągu, tj.)
string folder = dialog.SelectedPath;

A jeśli chcesz uzyskać nazwę pliku/ścieżkę, po prostu zrób to za pomocą przycisku Kliknij
FileDialog fileDialog = new OpenFileDialog();
fileDialog.ShowDialog();
folderpathTB.Text = fileDialog.FileName;

(folderpathTB to nazwa pola tekstowego, w którym chcę umieścić ścieżkę do pliku, LUB możesz przypisać ją również do zmiennej ciągu)
Uwaga: W przypadku okna dialogowego folder System.Windows.Forms.dll musi zostać dodany do projektu, w przeciwnym razie nie będzie działać.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Znalazłem kod poniżej z linku poniżej ... i zadziałało

Okno dialogowe wyboru folderu WPF
https://coderoad.ru/4007882/
using Microsoft.WindowsAPICodePack.Dialogs;var dlg = new CommonOpenFileDialog();
dlg.Title = "My Title";
dlg.IsFolderPicker = true;
dlg.InitialDirectory = currentDirectory;dlg.AddToMostRecentlyUsedList = false;
dlg.AllowNonFileSystemItems = false;
dlg.DefaultDirectory = currentDirectory;
dlg.EnsureFileExists = true;
dlg.EnsurePathExists = true;
dlg.EnsureReadOnly = false;
dlg.EnsureValidNames = true;
dlg.Multiselect = false;
dlg.ShowPlacesList = true;if (dlg.ShowDialog() == CommonFileDialogResult.Ok)
{
var folder = dlg.FileName;
// Do something with selected folder string
}
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Najlepszym sposobem na osiągnięcie tego, co chcesz, jest stworzenie własnej kontroli opartej na WPF lub użycie kontroli stworzonej przez inne osoby

dlaczego? ponieważ będzie zauważalne pogorszenie wydajności podczas korzystania z okna dialogowego winforms w aplikacji wpf (z jakiegoś powodu)

polecam ten projekt
https://opendialog.codeplex.com
https://opendialog.codeplex.com/
/

lub Nuget:
PM> Install-Package OpenDialog

jest bardzo przyjazny dla MVVM i nie zawija okna dialogowego winforms
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Sugerowałbym dodanie do pakietu nugget:
Install-Package OpenDialog

W takim razie sposób użycia to:
Gat.Controls.OpenDialogView openDialog = new Gat.Controls.OpenDialogView();
Gat.Controls.OpenDialogViewModel vm = (Gat.Controls.OpenDialogViewModel)openDialog.DataContext;
vm.IsDirectoryChooser = true;
vm.Show(); WPFLabel.Text = vm.SelectedFilePath.ToString();

Oto dokumentacja:

http://opendialog.codeplex.com/documentation
http://opendialog.codeplex.com/documentation
Działa dla plików, plików filtrowanych, folderów itp.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


Ookii
VistaFolderBrowserDialog
jest tym, czego potrzebujesz.
>
Jeśli chcesz tylko przeglądarkę folderów z

Ooki dialogi
http://www.ookii.org/software/dialogs
i nic więcej

źródło pobierania
http://www.ookii.org/software/dialogs
code, zaznacz pliki, których potrzebujesz do przeglądarki folderów (wskazówka: 7 plików) i działa dobrze w .NET 4.5.2. Musiałem dodać link do
System.Drawing
. Porównaj linki w oryginalnym projekcie z Twoim.
Jak określasz, których plików potrzebujesz? Otwórz swoją aplikację i Ookii w oddzielnych wystąpieniach programu Visual Studio. Dodaj
VistaFolderBrowserDialog.cs
do swojej aplikacji i kontynuuj dodawanie plików, aż błędy kompilacji znikną. Zależności znajdziesz w projekcie Ookii - kliknij z wciśniętym klawiszem Control na ten, który chcesz prześledzić z powrotem do jego pochodzenia (gra słów zamierzona).
Oto pliki, których potrzebujesz, jeśli jesteś zbyt leniwy, aby to zrobić ...
NativeMethods.cs
SafeHandles.cs
VistaFolderBrowserDialog.cs
\ Interop
COMGuids.cs
ErrorHelper.cs
ShellComInterfaces.cs
ShellWrapperDefinitions.cs

Edytuj wiersz 197 w
VistaFolderBrowserDialog.cs
, jeśli nie chcesz umieszczać ich w
Resources.Resx
<strike>
zgłoś nowy InvalidOperationException (Properties.Resources.FolderBrowserDialogNoRootFolder
</strike>
);
throw new InvalidOperationException("Unable to retrieve the root folder.");

Dodaj informację o prawach autorskich do swojej aplikacji zgodnie z ich
license.txt
Kod w linii 160-169
\ Ookii.Dialogs.Wpf.Sample \ MainWindow.xaml.cs
jest przykładem, którego możesz użyć, ale musisz usunąć
this
z
MessageBox.Show (this,
dla WPF.
Działa na moim komputerze [TM]
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wiem, że to stare pytanie, ale prostym sposobem na zrobienie tego jest użycie opcji FileDialog dostarczonej przez WPF i użycie System.IO.Path.GetDirectory (nazwa pliku).
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Żadna z tych odpowiedzi nie działała dla mnie (zwykle brakowało linku lub coś takiego)
Ale to się po prostu stało:
Korzystanie z FolderBrowserDialog w aplikacji WPF
https://coderoad.ru/4547320/
Dodaj link do
System.Windows.Forms
i użyj tego kodu:
var dialog = new System.Windows.Forms.FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dialog.ShowDialog();

Nie ma potrzeby wyszukiwania brakujących paczek. Lub dodaj duże klasy
Daje mi to nowoczesny selektor folderów, który pozwala mi również utworzyć nowy folder
Nie widziałem jeszcze tego efektu podczas wdrażania na inne komputery
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć czegoś takiego w WPF. Stworzyłem przykładową metodę.
Sprawdź poniżej.
public string getFolderPath()
{
// Create OpenFileDialog
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog(); OpenFileDialog openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = false; openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
if (openFileDialog.ShowDialog() == true)
{
System.IO.FileInfo fInfo = new System.IO.FileInfo(openFileDialog.FileName);
return fInfo.DirectoryName;
}
return null;
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się