TOC

This article has been localized into Czech by the community.

Dialogy:

OpenFileDialog

Pokaždé, když v téměř jakékoli aplikaci Windows otevřete nebo uložíte soubor, uvidíte přibližně stejné dialogy. Důvodem je samozřejmě to, že tyto dialogy jsou součástí Windows API a jsou tedy dostupné i vývojářům na platformě Windows.

Pro WPF najdete standardní dialogy pro otevírání i ukládání souborů v oboru názvů Microsoft.Win32. V tomto článku se zaměříme na třídu OpenFileDialog, která velmi usnadňuje zobrazení dialogu pro otevření jednoho nebo několika souborů.

Jednoduchý příklad dialogu OpenFileDialog

Začněme tím, že použijeme OpenFileDialog bez jakýchkoliv dalších možností, abychom načetli soubor do ovládacího prvku TextBox:

<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);
		}
	}
}

Jakmile kliknete na tlačítko Otevřít soubor, OpenFileDialog bude vytvořen a zobrazen. V závislosti na tom, kterou verzi Windows používáte a na zvoleném motivu, bude vypadat nějak takto:

Metoda ShowDialog() vrátí nulovatelný boolean, což znamená, že může být buď false, true nebo null. Pokud uživatel vybere soubor a stiskne "Otevřít", výsledek je True, a v tom případě se pokusíme načíst soubor do ovládacího prvku TextBox. Kompletní cestu k vybranému souboru získáme pomocí vlastnosti FileName dialogu OpenFileDialog.

Filtr

Obvykle, když chcete, aby uživatel ve vaší aplikaci otevřel soubor, chcete to omezit na jeden nebo několik typů souborů. Například Word většinou otevírá Word soubory (s příponou .doc nebo .docx) a Notepad většinou otevírá textové soubory (s příponou .txt).

Můžete specifikovat filtr pro váš OpenFileDialog, aby uživatel věděl, které typy souborů by měl ve vaší aplikaci otevírat, stejně jako omezit zobrazené soubory pro lepší přehled. To se dělá s vlastností Filter, kterou můžeme přidat do výše uvedeného příkladu, hned po inicializaci dialogu, takto:

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

Zde je výsledek.

Všimněte si, že dialog nyní obsahuje rozevírací seznam pro výběr typů souborů a že zobrazené soubory jsou omezeny na ty s příponou/příponami specifikovanými vybraným typem souboru.

Formát pro specifikaci filtru může na první pohled vypadat trochu zvláštně, ale funguje tak, že specifikuje lidsky čitelnou verzi požadované přípony/přípon souboru a pak jednu, kterou počítač snadno zpracuje, oddělené znakem (svislítko) pipe (|). Pokud chcete více než jeden typ souboru, jak to děláme v příkladu výše, je každá sada informací oddělena znakem svislítkem.

Shrnutí, následující části znamená, že chceme, aby byl typ souboru pojmenován "Textové soubory (*.txt)" (přípona v závorce je zdvořilost pro uživatele, aby věděl, které přípony jsou zahrnuty) a druhá část říká dialogu, aby zobrazil soubory s příponou .txt:

Text files (*.txt)|*.txt

Každý typ souboru může samozřejmě mít více přípon. Například obrazové soubory mohou být specifikovány jako soubory JPEG i PNG, takto:

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

Jednoduše oddělte každou příponu středníkem ve druhé části (té pro počítač) - v první části to můžete formátovat, jak chcete, ale většina vývojářů používá stejnou notaci pro obě části, jak je vidět na příkladu výše.

Nastavení počáteční složky

O počáteční složce použité OpenFileDialogem rozhoduje Windows, ale použitím vlastnosti InitialDirectory to můžete přepsat. Tuto hodnotu obvykle nastavíte na uživatelem určenou složku, složku aplikace nebo možná jen na složku, která byla naposledy použita. Můžete ji nastavit na cestu ve formátu řetězce, takto:

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

Pokud chcete použít jednu ze speciálních složek ve Windows, např. Plochu, Dokumenty nebo adresář Program Files, musíte být opatrní, protože ty se mohou lišit v každé verzi Windows a také mohou záviset na tom, který uživatel je přihlášen. .NET framework vám však může pomoci, stačí použít třídu Environment a její členy pro práci se speciálními složkami:

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

V tomto případě získávám cestu pro složku Dokumenty, ale podívejte se na výčet SpecialFolder - obsahuje hodnoty pro mnoho zajímavých cest. Pro úplný seznam si prosím přečtěte tento článek MSDN.

Více souborů

Pokud vaše aplikace podporuje otevírání více souborů nebo jednoduše chcete použít OpenFileDialog k výběru více než jednoho souboru najednou, musíte povolit vlastnost Multiselect. V následujícím příkladu jsme to udělali a jako zdvořilost vám, milý čtenáři, jsme také použili všechny výše zmíněné techniky, včetně filtrování a nastavení počátečního adresáře:

<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));
			}
		}
	}
}

Pokud tento kód otestujete, uvidíte, že nyní můžete vybrat více souborů ve stejné složce podržením klávesy Ctrl nebo Shift a kliknutím myši. Jakmile je výběr potvrzen, tento příklad jednoduše přidá názvy souborů do ovládacího prvku ListBox procházením vlastnosti FileNames.

Shrnutí

Jak vidíte, používání OpenFileDialog ve WPF je velmi snadné a opravdu se postará o mnoho práce za vás. Mějte na paměti, že pro snížení počtu řádků kódu se v těchto příkladech neprovádí žádné ošetření výjimek. Při práci se soubory a obecně při úkolech vstupu/výstupu byste měli vždy dávat pozor na výjimky, protože se mohou snadno vyskytnout kvůli uzamčenému souboru, neexistující cestě nebo souvisejícím problémům.


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!