This article has been localized into Hungarian by the community.
Az OpenFileDialog dialógusablak
Akármikor megnyitsz vagy elmentesz egy fájlt szinte bármely Windows-os alkalmazásban, nagyjából ugyanazokat a dialógusablakokat fogod látni. Ennek oka persze az, hogy ezek a dialógusablakok részei a Windows API-nak, és ezáltal elérhetőek a fejlesztők számára a Windows platformon.
A WPF esetében találhatsz sima dialógusablakokat mind fájlok megnyitására, mind azok elmentésére a Microsoft.Win32 névtérben. Ebben a cikkben az OpenFileDialog osztályra fogunk koncentrálni, amely nagyon egyszerűvé teszi egy vagy több fájl megnyitására szolgáló dialógusablakok megjelenítését.
Egyszerű OpenFileDialog példa
Kezdjük a dolgot az OpenFileDialog bármilyen extra opciót mellőző használatával, ahhoz, hogy betöltsük egy fájl tartalmát egy TextBox vezérlőbe:
<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);
}
}
}
Amikor megnyomod az "Open file" ("Fájl megnyitása") gombot, az OpenFileDialog példányosításra és megjelenítésre kerül. Attól függően, hogy a Windows melyik verzióját, és annak melyik témáját használod, valahogy így fog kinézni:
A ShowDialog() függvény egy nullable (null-képes/nullozható) boolean (logikai) értéket ad vissza, ami azt jelenti, hogy felveheti "false" ("hamis") és "true" ("igaz") értékeket, valamint lehet üres ("null") is. Ha a felhasználó kijelöl egy fájlt és megnyomja az "Open" ("Megnyitás") gombot, a visszatérési érték "True" lesz, és ebben az esetben megpróbáljuk betölteni a fájl tartalmát a TextBox vezérlőbe. A kijelölt fájl teljes elérési útját az OpenFileDialog FileName tulajdonságának lekérésével kaphatjuk meg.
Szűrő
Alapesetben, amikor azt szeretnéd, hogy a felhasználó megnyisson egy fájlt az applikációdban, a választható fájltípusok körét is szeretnéd leszűkíteni. Például: A Word általában Word fájlokat (.doc vagy .docx kiterjesztésű fájlok), a Notepad (Jegyzettömb) pedig szöveges fájlokat (.txt kiterjesztésű fájlok) nyit meg.
Meghatározhatsz egy szűrőt az OpenFileDialog számára, amivel jelzed a felhasználó felé, hogy milyen típusú fájlokat kéne megnyissanak a programodban, és ezzel egy időben leszűkíted a megjelenített fájlok halmazát a jobb átláthatóság érdekében. Ez a Filter tulajdonsággal érhető el, amelyet hozzá is adhatunk a fönti példához, rögtön azután, hogy inicializáltuk a dialógusablakot; valahogy így:
openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
Íme az eredmény:
Vedd észre, hogy a dialógusablak immár rendelkezik egy combo box-szal a fájltípusok kiválasztására, valamint, hogy a megjelenített fájlok köre csak a kiválasztott fájltípushoz tartozó kiterjesztésekkel rendelkező fájlokból áll.
A szűréshez tartozó formátum talán egy kissé furának tűnik első ránézésre, azonban nem áll másból, mint a kiterjesztések egy emberek által is olvasható, majd egy, a gép által egyszerűen értelmezhető verzióban való megadásából, egy cső (|) karakter által elválasztva egymástól. Amennyiben több fájltípust is szeretnél megadni - mint ahogyan az a fenti példában is szerepel - az egyes fájltípusokhoz tartozó információk halmazát is a cső karakterrel lehet elválasztani.
Tehát összesítve, a következő sor első része azt jelenti, hogy szeretnénk a választható fájltípust "Text files (*.txt)"-nek elnevezni (ahol a kiterjesztés a zárójelek között csak a felhasználó kényelmére szolgál, annak érdekében, hogy tudják, milyen kiterjesztések tartoznak az elfogadottak közé), míg a második része megmondja a dialógusablaknak, hogy csak a .txt kiterjesztésű fájlokat mutassa.
Text files (*.txt)|*.txt
Minden fájltípushoz tartozhat persze több kiterjesztés is. Például képfájlok esetében elfogadottak lehetnek a JPEG és a PNG fájlok is, a következőképp:
openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";
Egyszerűen válassz el minden kiterjesztést pontosvesszőkkel egymástól a második részben (a számítógép számára megadott rész) - az első részben úgy formázhatod őket, ahogyan szeretnéd, ám a legtöbb fejlesztő ugyanazt a jelölést alkalmazza mindkét részben, ahogyan az a fenti példában is látható.
A kezdeti könyvtár beállítása
Az OpenFileDialog által használt kezdeti könyvtár a Windows által kerül meghatározásra, ám azt az InitialDirectory tulajdonság használatával felülbírálhatod. Általában ezt az értéket egy, a felhasználó által meghatározott mappára, az alkalmazás mappájára, vagy esetleg a legutóbb használt mappára állítjuk. Egy string-ként formázott elérési útra a következőképp állíthatod be:
openFileDialog.InitialDirectory = @"c:\temp\";
Ha szeretnél egy speciális Windows könyvtárat használni, mint például az Asztal, a Dokumentumok vagy a Program Files, különös figyelmet kell fordítanod arra, hogy ezek elérése változó lehet minden Windows verzió esetén, és attól is függhet, hogy épp mely felhasználó van bejelentkezve. A .NET keretrendszer azonban el tud látni segítséggel; csak használd az Environment osztályt és annak tagjait, hogy elérd ezeket a speciális mappákat:
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Ebben az esetben a My Documents (Dokumentumok) mappa elérési útját kérem le, de nézd meg a SpecialFolder enumerációt - sok-sok érdekes elérési úthoz tartalmaz értékeket. A teljes listáért kérlek, nézd meg ezt: MSDN cikk
Több fájl
Amennyiben az alkalmazásod több egyszerre megnyitott fájlt is támogat, vagy csak egyszerűen szeretnéd arra használni az OpenFileDialog-ot, hogy több fájlt is kijelölj, engedélyezned kell a Multiselect tulajdonságot. A következő példában épp ezt csináltuk, és udvariasságként, kedves olvasó, emellett az összes feljebb említett technikát is alkalmaztuk, beleértve a szűrést és a kezdeti könyvtár beállítását:
<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));
}
}
}
}
Ha leteszteled ezt a kódot, látni fogod, hogy most már több fájlt is ki tudsz jelölni egy mappában, a Ctrl vagy Shift billentyű nyomva tartásával, és az ezalatt fájlokra való kattintással. A kijelölt fájlok elfogadása után ez a példa egyszerűen hozzáadja a fájlok nevét egy ListBox vezérlőhöz, a FileNames tulajdonságon való végigiterálással.
Összegzés
Amint látod, az OpenFileDialog használata WPF-ben nagyon könnyű, és rengeteg munkát megspórol neked. Kérlek vedd észre, hogy annak érdekében, hogy a kódsorok mennyisége minimális legyen, nincs kivételkezelés alkalmazva ezekben a példákban. Amikor fájlokkal, vagy úgy általánosságban IO műveletekkel dolgozol, mindig érdemes figyelned a kivételekre (exception-ök), mivel igen könnyen kaphatsz egyet egy zárolt fájl, nem létező elérési út, vagy hasonló probléma miatt.