This article has been localized into Danish by the community.
OpenFileDialog
Når du vil åbne eller gemme en fil i praktisk talt enhver Windows applikation, vil du se stort set den samme dialog for at gøre dette. Grunden er selvfølgelig, at disse dialoger er del af Windows API'et, og derfor er tilgængelige for udviklere på Windows platformen.
Til WPF finder du standarddialogerne til både åbning og gemning af filer i namespacet Microsoft.Win32. I denne artikel vil vi fokusere på OpenFileDialog klassen, som gør det meget nemt at vise en dialog til åbning af en eller flere filer.
Simpelt OpenFileDialog eksempel
Lad os begynde med at bruge OpenFileDialog uden nogle ekstra indstillinger til at indlæse en fil i en TextBox kontrol:
<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 klikker på Open file knappen, vil OpenFileDialog blive instantieret og vist. Afhængig af hvilken version af Windows, du bruger, og det valgte tema, vil det se nogenlunde således ud:
ShowDialog() vil returnere en nullable boolean værdi, hvilket betyder, at den kan være enten false, true eller null. Hvis brugeren vælger en fil og trykker "Open", er resultatet True, og i det tilfælde kan vi prøve at indlæse filen i TextBox kontrollen. Vi får den fulde sti til den valgte fil ved at bruge FileName egenskaben på OpenFileDialog.
Filter
Normalt, når du ønsker at åbne en fil i din applikation, vil du gerne begrænse det til en eller få filtyper. F.eks. åbner Word primært Word filer (med endelsen .doc eller .docx), og Notesblok åbner primært tekstfiler (med endelsen .txt).
Du kan angive et filter til din OpenFileDialog for at fortælle brugeren hvilke filtyper, de skal åbne med din applikation, samt begrænse de viste filer for at få et bedre overblik. Dette gøres via Filter egenskaben, som vi kan tilføje til eksemplet ovenfor, lige efter initialisering af dialogen, som her:
openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
Her er resultatet:
Bemærk hvordan dialogen nu har et kombinationsfelt til valg af filtyper, og at de viste filer begrænses til dem med de(n) endelse(r), der angives af den valgte filtype.
Formatet til at angive filteret kan se lidt mærkeligt ud ved første øjekast, men det virker ved at angive en læsbar version af de(n) ønskede fil-endelse(r), og derefter en, som computeren nemt kan tolke, adskilt af et pipe-tegn (|). Hvis du ønsker mere end en filtype, som vi gør i eksemplet ovenfor, skal hvert sæt information også adskilles med et pipe-tegn.
Så, for at opsummere, denne del betyder, at vi ønsker, at filtypen skal navngives "Text files (*.txt)" (endelsen i parentesen er information til brugeren, så de ved hvilke(n) endelse(r), der vises), og den anden del fortæller dialogen, at den skal vise filer med en .txt endelse:
Text files (*.txt)|*.txt
Hver filtype kan selvfølgelig have flere endelser. F.eks. kunne billedfiler angives som både JPEG og PNG filer, som her:
openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";
Bare adskil hver endelse med et semikolon i den anden del (delen til computeren) - i den første del kan du formattere det, som du vil, men de fleste udviklere plejer at bruge den samme notation for begge dele, som vist i eksemplet ovenfor.
Angivelse af startmappe
Den startmappe, som OpenFileDialog bruger, besluttes af Windows, men ved at benytte InitialDirectory egenskaben, kan du overstyre det. Du vil normalt sætte denne værdi til en specifik mappe, applikationsmappen, eller måske den sidste brugte mappe. Du sætter det til en sti i streng-format, som her:
openFileDialog.InitialDirectory = @"c:\temp\";
Hvis du ønsker at bruge en af de specielle mapper i Windows, f.eks. Skrivebordet, Mine dokumenter eller Programmer mappen, skal du passe på, eftersom disse kan variere mellem forskellige versioner af Windows, og også afhængig af hvilken bruger, der er logget ind. Dog kan .NET frameworket hjælpe dig - du skal bare bruge Environment kalssen og dens medlemmer til at arbejde med specielle mapper:
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
I dette tilfælde henter jeg stien til Mine dokumenter mappen, men kig på SpecialFolder enumerationen - den indeholder værdier for en hel masse interessante stier. For at se en fuld liste, kan du kigge i denne MSDN artikel
Flere filer
Hvis din applikation understøtter flere åbne filer, eller du hbare ønsker at bruge OpenFileDialog til at vælge mere end en fil ad gangen, skal du aktivere Multiselect egenskaben. I det næste eksempel har vi gjort det, og vi har også anvendt alle de teknikker, der er beskrevet ovenfor - inklusive filtrering og angivelse af startmappe:
<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));
}
}
}
}
Hvis du tester denne kode, vil du se, at du nu kan vælge flere filer i samme mappe ved at holde enten Ctrl eller Shift nede og klikke med musen. Efter accept tilføjer dette eksempel filnavnene til ListBox kontrollen ved at gennemgå FileNames egenskaben.
Resume
Som du kan se, er anvendelsen af OpenFileDialog i WPF meget let og tager hånd om en masse arbejde for dig. Vær opmærksom på, at for at reducere antallet af kodelinjer, er der ingen undtagelseshåndtering i disse eksempler. Når der arbejdes med filer og foretages IO opgaver generelt, bør du altid holde øje med undtagelser, da disse nemt kan indtræffe på grund af låste filer, ikke-eksisterende stier eller lignende problemer.