TOC

This article is currently in the process of being translated into Swedish (~99% done).

Dialogs:

The OpenFileDialog

Du ser ungefär samma dialog för att öppna eller spara en dialog i nästan alla Windowsapplikationer. Anledningen är så klart att dessa dialoger är en del av Windows API och därför också tillgängliga för utvecklare på Windows-plattformen.

I WPF hittar du standarddialoger för att både öppna och spara filer i namespacet Microsoft.Win32. I denna artikel kommer ci att fokusera på klassen OpenFileDialog. Den gör det mycket enkelt att visa en dialog för att öppna en eller flera filer.

Ett enkelt exempel av OpenFileDialog

Vi börjar med att använda dialogen OpenFileDialog utan några extra val för att ladda en fil till en TextBox-kontroll.

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

När du klickar på knappen "Open file" kommer dialogen OpenFileDialog att instantieras och visas. Beroende på vilken Windows-version och vilket tema du använder kommer den att se ut ungefär så här:

Anropet ShowDialog() returnerar ett null-bart boolskt värde vilket innebär att det kan vara antingen falskt, sant eller null. Om en användare väljer en fil och klickar på "Open" är resultatet sant, True, och då kommer vi att försöka ladda in filen till TextBox-kontrollen. Vi får hela sökvägen av den valda filen genom att använda egenskapen FileName på instansen av OpenFileDialog.

Filter

Normalt när du vill att användaren ska öppna en fil i ditt program vill du begränsa filen till en eller ett fåtal filtyper. Word, till exempel, öppnar vanligtvis Word-filer (med filnamn som slutar på .doc eller .docx) och Anteckningar öppnar vanligtvis textfiler (med filnamn som slutar på .txt).

Du kan ange ett filter för dialogen OpenFileDialog för att beskriva för användaren vilka filtyper de ska öppna i ditt program. Du kan också begränsa antalet filer som visas för att förenkla för användaren. Detta görs genom egenskapen Filter, som vi kan lägga till till exemplet ovan efter att vi har initierat dialogen:

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

Så här blir resultatet:

Dialogen ger nu en möjlighet att välja filtyp, och bara de filer som slutar på den valda filtypen visas i listningen ovanför.

Formatet för att ange ett filter kan kännas lite konstruerat först men det fungerar genom att ange en version för användaren av den önskade filtypen, och sedan en för datorn för att enkelt filtrera, separerade med ett pipe-tecken (|). Om du vill ha mer än en filtyp, som vi gör i exemplet ovan, anges också varje par av information avgränsade med ett pipe-tecken.

Sammanfattningsvis betyder exemplet att vi vill ha filtypen att visas som "Text filer (*.txt)" (filnamnsslutet i parentesen är en hjälp till användaren så hen vet vilka filtyper som är inkluderade) och den andra delen berättar för dialogen att den ska visa filer vars filnamn slutar på ".txt".

Text files (*.txt)|*.txt

Varje filtyp kan såklart ha flera filnamnsavslut. Ta till exempel bildfiler. De kan vara både JPEG eller PNG-filer:

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

Du separerar varje filnamnsavslut med ett semikolon (;) i den andra delen (delen för datorn). I den första delen kan du skriva det så som det passar, men de flesta utvecklare verkar använda samma format för båda delarna, vilket du ser i exemplet ovan.

Sätta startmappen

Mappen som OpenFileDialog visar när den först startar bestäms av operativsystemet om programmet inte gör ett aktivt val, men genom att sätta egenskapen InitialDirectory kan du välja vilken mapp som ska visas först. Du sätter vanligtvis detta värde till en mapp som användaren valt, programmets mapp eller kanske helt enkelt till den senast använda mappen. Du kan sätta den till en sökväg som en sträng:

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

Vill du använda en av de speciella mapparna i Windows, till exempel Skrivbordet, Mina dokument eller Program-mappen behöver du vara försiktig. Sökvägen till dessa mappar kan variera mellan Windows-versioner och också bero på vilken användare som har loggat in. .NET Framework kan hjälpa dig där. Använd klassen Environment och dess metoder och egenskaper för att hantera dessa speciella mappar.

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

I detta fall får jag sökvägen till mappen Mina dokument. Kolla igenom enummerationen SpecialFolder - den innehåller värden för många intressanta sökvägar. Se också MSDN-artikeln för en fullständig lista.

Flera filer

Om ditt program tillåter flera öppna filer eller du helt enkelt vill använda OpenFileDialog för att välja mer än en fil samtidigt behöver du aktivera egenskapen Multiselect. I exemplet nedan har vi gjort just det och som en väntjänst till dig, kära läsare, har vi också inkluderat alla de tekniker vi nämnt ovan, inklusive filter och startmapp:

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

Om du testar att köra denna kod ser du att du nu kan välja flera filer i samma mapp genom att hålla ner antingen Ctrl eller Shift och klicka med musen. När du accepterat lägger exemplet till filnamnen till ListBox-kontrollen genom att loopa igenom egenskapen FileNames.

Sammanfattning

Som du kan se är användandet av OpenFileDialog i WPF väldigt enkelt och tar hand om mycket arbete åt dig. För att minska mängden kodrader har vi inte någon felhantering i dessa exempel. När du arbetar med filer eller gör I/O i allmänhet ska du alltid ha en bra felhantering då fel enkjelt kan uppstå på grund av en låst fil, en sökväg som inte finns eller liknande problem.


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!