TOC

This article has been localized into Slovak by the community.

Dialógy:

OpenFileDialog

Vždy, keď otvárate alebo ukladáte súbor, v takmer každej Windows aplikácii budete vidieť približne rovnaké dialógy na vykonanie tejto akcie. Dôvodom je samozrejme to, že tieto dialógy sú súčasťou Windows API a teda sú pre vývojárov prístupné na Windows platforme.

Štandardné dialógy pre otváranie a ukladanie súborov pre WPF nájdete v Microsoft.Win32 mennom priestore. V tomto článku sa budeme koncentrovať na triedu OpenFileDialog, ktorá nám veľmi uľahčuje zobrazenie dialógu na otváranie jedného alebo viacerých súborov.

Jednoduchý príklad použitia OpenFileDialog

Začnime s používaním OpenFileDialog bez akýchkoľvek osobitných volieb na načítanie súboru do ovládacieho 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);
		}
	}
}

Hneď, ako kliknete na Open file ovládací prvok, vytvorí sa inštancia OpenFileDialog a dialóg sa zobrazí. V závislosti na tom, ktorú verziu Windows používate a akú tému máte vybratú, bude dialóg vyzerať asi takto:

ShowDialog() vráti nulovateľnú boolean hodnotu, čo znamená, že môže byť buď False alebo True alebo Null. Ak si užívateľ vyberie súbor a stlačí "Open", potom je výsledok True a v tomto prípade sa pokúšame načítať súbor do TextBox ovládacieho prvku. Úplnú cestu k vybratému súboru získame použitím FileName vlastnosti z triedy OpenFileDialog.

Filter

Obvykle ak chcete, aby užívateľ otvoril súbor vo vašej aplikácii, chcete akciu obmedziť na jeden alebo niekoľko typov súboru. Napríklad, Word väčšinou otvára wordovský súbor (s rozšírením .doc alebo .docx) a Notepad väčšinou otvára textové súbory (s rozšírením .txt).

Môžete špecifikovať filter pre váš OpenFileDialog na indikáciu užívateľom, ktoré typy súborov by mali byť otvárané vo vašej aplikácii, rovnako ako aj na obmedzenie zobrazovaných súborov kvôli väčšej prehľadnosti. To všetko sa robí pomocou vlastnosti Filter, ktorú môžeme pridať k príkladu hore hneď po inicializácii dialógu, podobne ako tuto:

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

Tu je výsledok:

Všimnite si, že dialóg má combo box ovládací prvok pre výber typu súborov, a že zobrazené súbory sú vyfiltrované podľa rozšírenia určeného vybratým typom súboru.

Formát na špecifikáciu filtra možno vyzerá trošku čudne na prvý pohľad ale pracuje na základe vyšpecifikovanej pre ľudí zrozumiteľnej verzie želaného typu alebo typov súboru a potom uvedením zápisu, ktorý počítač vie jednoducho parsovať a toto je oddelené znakom ‘|’ . Ak chcete viac ako jeden typ súboru, ako sme urobili v príklade hore, tak každá sada informácie je taktiež oddelená znakom ‘|’.

Na zosumarizovanie, nasledujúca časť znamená, že chceme typ súboru pomenovaný "Text files (*.txt)" (rozšírenie v zátvorkách je láskavosť k používateľom, aby vedeli, ktoré rozšírenia sú zahrnuté) a druhá časť hovorí dialógu aby zobrazil súbory s .txt rozšírením:

Text files (*.txt)|*.txt

Každý typ súboru môže mať samozrejme viacero rozšírení. Napríklad, obrázkové súbory môžu byť špecifikované ako JPEG a PNG súbory, ako toto:

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

Jednoducho oddeľte každé rozšírenie pomocou dvojbodky v druhej časti (tej pre počítač) - v prvej časti môžete formátovať spôsobom, ako chcete, ale väčšina programátorov zdá sa používa rovnakú notáciu pre obidve časti, ako vidno na príklade hore.

Nastavenie iniciálneho adresára

Iniciálny adresár používaný v OpenFileDialog je nastavený operačným systémom Windows, ale pomocou vlastnosti InitialDirectory ho môžete zmeniť. Obvykle nastavíte túto hodnotu na adresár špecifický pre používateľa, na adresár aplikácie alebo možno iba na adresár, ktorý bol použitý naposledy. Môžete ju nastaviť ako cestu vo formáte stringu, ako toto:

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

Ak chcete použiť niektorý zo špeciálnych adresárov vo Windows, napr. Desktop, My Documents alebo Program Files adresár, musíte byť opatrní, keďže tieto sa môžu meniť s každou verziou Windows a tiež môžu závisieť od toho, ktorý používateľ je prihlásený. .NET framework vám môže pomôcť, použite iba Environment triedu a jej členy na prácu so špeciálnymi adresármi:

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

V tomto prípade získam cestu pre adresár My Documents, ale pozrite sa na zoznam SpecialFolder - obsahuje hodnoty viacerých zaujímavých ciest. Pre úplný zoznam, prosím pozrite tento článok MSDN.

Viaceré súbory

Ak vaša aplikácia podporuje viaceré otvorené súbory alebo jednoducho chcete použiť OpenFileDialog na výber viac ako jedného súboru v rovnakom čase, potrebujete povoliť vlastnosť Multiselect. V nasledujúcom príklade sme urobili práve toto, a ako láskavosť ku Vám, drahý čitateľ, sme taktiež aplikovali všetky techniky, o ktorých sme sa zmienili hore, včítane filtrovania a nastavenia iniciálneho adresára:

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

Ak budete testovať tento kód, uvidíte, že teraz môžete vybrať viacero súborov v rovnakom adresári pomocou stlačeného buď Ctrl alebo Shift a kliknutím myšou. Ihneď po akceptovaní tento príklad jednoducho pridá mená súborov do ovládacieho prvku ListBox, prechádzaná v cykle cez vlastnosť FileNames.

Záver

Ako môžete vidieť, použitie OpenFileDialog vo WPF je veľmi jednoduché a skutočne sa za vás stará o veľa vecí. Prosím, buďte si vedomí, že kvôli redukcii počtu riadkov kódu v príkladoch nebolo uvedené žiadne odchytávanie výnimiek. Počas práce so súbormi a pri vykonávaní IO taskov vo všeobecnosti by ste vždy mali odchytávať výnimky, pretože tieto sa môžu ľahko vyskytnúť kvôli zamknutému súboru, nejestvujúcej ceste a podobným problémom.


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!