TOC

This article has been localized into German by the community.

Dialoge:

Der OpenFileDialog

Wenn eine Datei geöffnet oder gespeichert werden muss, werden in fast jeder Windows-Anwendung identische Dialoge gezeigt. Der Grund dafür ist natürlich, dass diese Dialoge Teil der Windows API sind und somit den Entwicklern auf der Windows Plattform zur Verfügung stehen.

In WPF finden Sie Standarddialoge für jeweils das Öffnen und Speichern von Dateien im Microsoft.Win32 Namespace. In diesem Artikel konzentrieren wir uns auf die OpenFileDialog Klasse, mit der wir auf einfache Weise einen Dialog zum Öffnen einer oder mehrerer Dateien anzeigen können.

Einfaches OpenFileDialog Beispiel

Fangen wir damit an, den OpenFileDialog ohne jeglichen Einstellungen zu nutzen, um eine Datei in ein TextBox-Control zu laden:

<Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFile_Click">Open file</Button>
        </WrapPanel>
        <TextBox Name="txtEditor" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace WpfTutorialSamples.Dialogs
{
	public partial class OpenFileDialogSample : Window
	{
		public OpenFileDialogSample()
		{
			InitializeComponent();
		}

		private void btnOpenFile_Click(object sender, RoutedEventArgs e)
		{
			OpenFileDialog openFileDialog = new OpenFileDialog();
			if(openFileDialog.ShowDialog() == true)
				txtEditor.Text = File.ReadAllText(openFileDialog.FileName);
		}
	}
}

Sobald Sie auf den "Datei öffnen" Button klicken, wird OpenFileDialog instanziiert und angezeigt. Je nachdem welche Version von Windows Sie nutzen und welches Windows-Theme ausgewählt wurde, wird es in etwa so aussehen:

Der ShowDialog() liefert einen nullable boolschen Wert zurück. Das heißt, dass er entweder falsch, wahr oder null sein kann. Wenn der Nutzer eine Datei auswählt und "Öffnen" klickt, ist der zurückgegebene Wert wahr, und in dem Fall versuchen wir, die Datei in das TextBox Control zu laden. Wir erhalten den vollständigen Pfad der ausgewählten Datei indem wir die FileName Eigenschaft des OpenFileDialogs benutzen.

Filter

Normalerweise, wenn der Nutzer eine Datei in der Anwendung öffnen will, wollen Sie die Auswahl auf einen oder ein paar wenige Dateitypen limitieren. Zum Beispiel öffnet Word meistens nur Word-Dateien (mit der Dateiendung .doc oder .docx) und Notepad öffnet Text-Dateien (mit der Dateiendung .txt).

Du kannst einen Filter für den OpenFileDialog spezifizieren um dem Nutzer anzuzeigen welche Datentypen er öffnen sollte. Zusätzlich werden hierdurch auch die angezeigten Dateien im Dialog gefiltert, um eine bessere Übersicht zu ermöglichen. Dies wird mit dem Filter Property getan, den wir dem obigen Beispiel direkt nach der Initialisierung wie folgt hinzufügen können:

openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";

Hier ist das Resultat:

Beachten Sie bitte, dass der Dialog nun eine Combobox für die Auswahl an Datentypen verwendet und dass die angezeigten Dateien gefiltert sind auf den jeweils ausgewählten Datentyp.

Das Format zum Spezifizieren des Filters erscheint womöglich zunächst eigenartig, aber es funktioniert, indem zuerst eine leserliche Version der gewünschten Dateitypen angegeben wird, und dann eine Version, die vom Computer einfach geparst werden kann. Die beiden Versionen werden durch einen senkrechten Strich (|) getrennt. Wenn Sie mehr als einen Datentyp haben möchten (wie im obigen Beispiel), wird auch jede weitere Gruppe von Informationen durch einen senkrechten Strich getrennt.

Zusammenfassend bedeutet der folgende Teil, dass der Dateityp "Textdateien (*.txt)" genannt werden soll (die Deteiendung in der Klammer ist eine Gefälligkeit für den Benutzer, damit er weiß, welche Dateiendung(en) enthalten sind) und der zweite Teil weist den Dialog an, Dateien mit der Endung .txt anzuzeigen:

Text files (*.txt)|*.txt

Jeder Dateityp kann mehrere Endungen haben. Zum Beispiel stehen JPEG und PNG beide für Bilddateien.

openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";

Trennen Sie einfach jede Dateiendung mit einem Semikolon im zweiten Teil (dem für den Computer) - im ersten Teil können Sie sie so formatieren, wie Sie wollen, aber die meisten Entwickler scheinen die gleiche Notation für beide Teile zu verwenden, wie im obigen Beispiel.

Festlegen des anfänglichen Ordners

Das vom OpenFileDialog verwendete Startverzeichnis wird von Windows festgelegt, kann aber mit der Eigenschaft InitialDirectory überschrieben werden. Normalerweise setzen Sie diesen Wert auf ein bestimmtes Verzeichnis, das Anwendungsverzeichnis oder vielleicht nur auf das zuletzt verwendete Verzeichnis. Sie können es auf einen Pfad in einem Stringformat wie diesem setzen:

openFileDialog.InitialDirectory = @"c:\temp\";

Wenn Sie einen der speziellen Ordner unter Windows verwenden möchten, z.B. den Desktop, "Eigene Dateien" oder das Programmverzeichnis, müssen Sie besondere Vorsicht walten lassen, da diese je nach Windows-Version unterschiedlich sein können und auch davon abhängen, welcher Benutzer angemeldet ist. Das .NET-Framework kann Ihnen jedoch helfen. Verwenden Sie einfach die Environment-Klasse für den Umgang mit speziellen Ordnern:

openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

In diesem Fall bekomme ich den Pfad für den Ordner "Eigene Dateien", aber schauen Sie sich die Aufzählung SpecialFolder an - sie enthält Werte für viele interessante Pfade. Eine vollständige Liste finden Sie in diesem MSDN Artikel.

Mehrere Dateien

Wenn Ihre Anwendung das Öffnen mehrerer Dateien unterstützt oder Sie einfach den OpenFileDialog verwenden möchten, um mehr als eine Datei gleichzeitig auszuwählen, müssen Sie die Multiselect-Eigenschaft aktivieren. Im nächsten Beispiel haben wir genau das getan, und aus Höflichkeit für Sie, lieber Leser, haben wir auch alle oben genannten Techniken angewandt, einschließlich des Filtern und Festlegens des Anfangsverzeichnisses:

<Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogMultipleFilesSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogMultipleFilesSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFiles_Click">Open files</Button>
        </WrapPanel>
        <ListBox Name="lbFiles" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace WpfTutorialSamples.Dialogs
{
	public partial class OpenFileDialogMultipleFilesSample : Window
	{
		public OpenFileDialogMultipleFilesSample()
		{
			InitializeComponent();
		}

		private void btnOpenFiles_Click(object sender, RoutedEventArgs e)
		{
			OpenFileDialog openFileDialog = new OpenFileDialog();
			openFileDialog.Multiselect = true;
			openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
			openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
			if(openFileDialog.ShowDialog() == true)
			{
				foreach(string filename in openFileDialog.FileNames)
					lbFiles.Items.Add(Path.GetFileName(filename));
			}
		}
	}
}

Wenn Sie diesen Code testen, werden Sie sehen, dass Sie nun mehrere Dateien im gleichen Verzeichnis auswählen können, indem Sie entweder Strg oder die Umschalt-Taste gedrückt halten und mit der Maus klicken. Einmal akzeptiert, fügt dieses Beispiel einfach die Dateinamen zum ListBox-Steuerelement hinzu, indem es die Aufzählung in der FileNames-Eigenschaft durchläuft.

Zusammenfassung

Wie Sie sehen, ist die Benutzung des OpenFileDialogs in WPF sehr einfach und nimmt Ihnen viel Arbeit ab. Bitte beachten Sie, dass in diesen Beispielen keine Ausnahmebehandlung durchgeführt wird, um die Anzahl der Codezeilen zu reduzieren. Wenn Sie mit Dateien arbeiten und Ein/Ausgabe-Operationen im Allgemeinen ausführen, sollten Sie immer nach Ausnahmen Ausschau halten, da diese aufgrund einer gesperrten Datei, eines nicht existierenden Pfades oder verwandter Probleme leicht auftreten können.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!