This article has been localized into Turkish by the community.
OpenFileDialog Diyaloğu
Hemen tüm windows uygulamalarında bir dosya açmaya ya da kaydetmeye kalktığınızda bunu yapan benzer diyaloglar görürsünüz. Bunun sebebi tabi ki bu diyaloglar Windows API'ın bir parçasıdır ve Windows platformunda geliştirme yapan tüm yazılımcılar tarafından erişilebilir.
WPF için dosyaları açmak veya kaydetmek için standart diyalogları Microsoft.Win32 namespace içinde bulacaksınız. Bu yazıda OpenFileDialog üzerinde fokuslanacağız, bu bir ya da daha fazla dosyayı açmayı kolaylaştıran bir diyalog gösterir.
Basit OpenFileDialog örneği
Hadi bir TextBox kontrolüne extra opsiyonları olmadan OpenFileDialog kullanarak başlayalım :
<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);
}
}
}
Open file butonuna tıkladığınızda OpenFileDialog nesnesi oluşturulur ve gösterilir. Hangi Windows versiyonu kullandığın ve hangi temayı seçtiğine göre değişir ama şuna benzer bir şey olur :
ShowDialog() metodu null olabilen bir boolean değer döner, değeri true, false ya da null olabilir. Eğer kullanıcı bir dosya seçer ve "Open" (Aç) butonuna tıklarsa cevap True olur, ve bu durumda biz dosyayı TextBox kontrole yükleriz. Seçilen dosyanın komple path değerini OpenFileDialog nesnesinin FileName özelliğinden alırız.
Filtre
Normalde uygulamanızda kullanıcının bir dosya açmasını istediğinizde bir ya da birkaç dosya tipiyle seçenekleri kısıtlamak istersiniz. Mesela Word uygulaması çoğunlukla Word dosyalarını açar (.doc veya .docx uzantılı olurlar) ve Notepad genellikle text dosyaları açar (.txt uzantılı olurlar).
Uygulamanızda OpenFileDialog'un kullanıcıya hangi tür dosyaları seçmesini önerecek şekilde bir filtreleme belirtebilirsiniz, böylece sadece olası dosyaları gösteren temiz bir görünüm oluşur. Bunu Filter özelliğini üstteki örneğe hemen diyalog nesnesi üretilmesi sonrasında şu şekilde değer vererek yapılır :
openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
İşte sonuç :
Dikkat ederseniz diyalog şimdi dosya tiplerini seçebileceğiniz bir combo box'a sahip, listesinde de filtrede belirtilen dosya tipleri var.
İlk bakışta filtre değerinin giriliş şekli biraz ilginç gelebilir, fakat öncesinde anlaşılabilir okunan bir açıklama ve sonra bilgisayarın kolayca işleyebileceği biçimde bir veri, ve aralarında boru karakteri ( | ). Birden fazla dosya tipi istiyorsak da yukarıda olduğu gibi bunların arasına da boru karakteri konur.
Yani toparlamak gerekirse aşağıdaki ilk kısımda "Text files (*.txt)" açıklamasıdır (parantez içindeki *.txt şeklindeki uzantı açıklaması sadece kullanıcıya hangi uzantıda dosya arandığını nezaketen göstermek içindir) ve ikinci kısımda diyaloğa hangi uzantılara sahip dosyaları göstermesi gerektiği belirtiliyor :
Text files (*.txt)|*.txt
Her dosya tipi birden fazla uzantı şekline sahip olabilir. Örneğin resim dosyaları JPEG de olabilir PNG de olabilir, şunun gibi :
openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";
İkinci parçada olası uzantılar arasına noktalı virgül konarak yazılır (bilgisayarın algıladığı değer) - ilk parçada istediğiniz şekilde ayırabilirsiniz sonuçta bir açıklama burası, fakat çok geliştirici yukarıda görüldüğü gibi her iki parçada da aynı notasyonu kullanır.
Başlangıç klasörünü ayarlamak
Kendi haline bırakırsak OpenFileDialog diyaloğunun açıldığı klasör Windows tarafından belirlenir (en son bu diyalog nerede kullanıldıysa orası), ama InitialDirectory özelliğini kullanarak üzerine yazabilirsiniz. Bu değeri genelde kullanıcı tanımlı bir klasör, uygulama klasörü veya belki uygulamanızın son kullandığı klasör (Windows değil) olarak ayarlarsınız. Genelde string formatında girilen path bilgisi şuna benzer :
openFileDialog.InitialDirectory = @"c:\temp\";
Eğer Windows'un örn. Desktop, My Documents veya Program Files özel klasörlerinden birini isterseniz, Wİndows versiyonuna göre ve login yapan kullanıcıya göre değiştiği için özel itina gerekecektir. Tabi ki .NET framework size yardımcı olabilir, sadece Environment sınıfı ve üyelerini kullanarak özel klasörlere erişirsiniz :
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Bu örnekte ben My Documents klasörünü aldım, fakat My Documents enumerasyonu üyelerine bir bakın - bir çok enteresan path bilgisi var burada. Tam bir liste için şu MSDN makalesine bakabilirsiniz.
Birden çok dosya seçimi
Eğer uygulamanız birden fazla dosya açılmasını destekleyecekse veya sadece OpenFileDialog'u bir kerede birden fazla dosya seçmekte kullanmak istiyorsanız, Multiselect özelliğini aktif etmelisiniz. Sonraki örnekte böyle yaptık ve size kıyak olsun diye , sevgili okuyucu , yukarıdaki tüm filtreleme ve başlangıç klasörü belirlemeleri de ekledik :
<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));
}
}
}
}
Eğer bu kodu çalıştırırsanız dosya açma diyaloğunda aynı klasör içindeki birden fazla dosyayı Ctrl ya da Shift basarken mouse ile tıklayarak seçebilirsiniz. Seçiminizi onayladıktan sonra örnekteki kod ListBox kontrolüne dosya isimlerini FileNames özelliği değerleri üzerinden çevrim ile ekler.
Sonuç
Gördüğünüz üzere WPF'de OpenFileDialog kullanmak çok kolay ve sizin için bir çok işleri yönetiyor. Lütfen şunu aklınızda tutunuz, bu örneklerde kod okunabilirliği için istisnai durumlar konulmamıştır. Dosyalarla çalışırken ya da genelde IO görevleri yaparken her zaman istisnai durumlar düşünülmelidir, sıklıkla kilitli dosyalara veya olmayan path gibi şeylerle karşılaşılabilir.