This article has been localized into Italian by the community.
L' OpenFileDialog
Ogni volta che apri o salvi un file in quasi qualsiasi applicazione di Windows, vedrai approssimativamente gli stessi dialogs. La ragione è certamente legata al fatto che questi dialogs sono parte delle API di Windows e perciò sono accessibili agli sviluppatori nella piattaforma Windows.
Per il WPF, troverai gli standard dialog per entrambe le operazioni di apertura e salvataggio nel namespace Microsoft.Win32. In questo articolo ci concentreremo sulla classe OpenFileDialog, che rende molto semplice mostrare un dialog per aprire uno o più file.
Esempio semplice OpenFileDialog
Iniziamo usando il OpenFileDialog senza opzioni aggiunte, per caricare un file nel controllo 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);
}
}
}
Una volta che clicchi sul bottone Apri file, il OpenFileDialog sarà istanziato e mostrato. Dipendentemente dalla versione di Windows che stai usando e dal tema selezionato, apparirà come una cosa del genere:
La chiamata ShowDialog() restituirà un booleano nullable, cioè un valore che può essere Vero, Falso o Nullo. Se l'utente seleziona un file e preme "Open", il risultato è Vero (True), e in quel caso, proviamo a caricare il file nel controllo TextBox. Otterremo il path completo del file selezionato usando la proprietà FileName del controllo OpenFileDialog.
Filtro
Normalmente quando vuoi che il tuo utente apra un file nella tua applicazione, vuoi limitarlo a uno o un paio di tipi di file. Ad esempio, Word si apre principalmente File Word (con estensione .doc o .docx) e Blocco note per lo più file di testo aperti (con estensione .txt).
È possibile specificare un filtro per OpenFileDialog per indicare all'utente quali tipi di file devono aprire nella propria applicazione, nonché limitando i file mostrati per una migliore visione d'insieme. Questo viene fatto con la proprietà Filter, che possiamo aggiungere all'esempio sopra, subito dopo l'inizializzazione del file dialog, come questo:
openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
Ecco il risultato:
Si noti come la finestra di dialogo ora abbia una casella combinata per selezionare i tipi di file e che i file mostrati siano limitati a quelli con le estensioni specificate dal tipo di file selezionato.
Il formato per specificare il filtro potrebbe sembrare un po 'strano a prima vista, ma funziona specificando una versione leggibile dall'uomo dell'estensione del file desiderato e poi una per il computer per poter essere analizzato facilmente, separati con un carattere pipe (|). Se vuoi più di un tipo di file, come visto nell'esempio precedente, ogni set di informazioni viene separato con un carattere pipe.
Quindi, per riassumere, la parte che segue indica che vogliamo che il tipo di file sia denominato "File di testo (* .txt)" (l'estensione tra parentesi è una cortesia per l'utente, in modo che sappiano quali estensioni sono incluse) e la seconda parte indica alla finestra di dialogo di mostrare i file con estensione .txt:
Text files (*.txt)|*.txt
Naturalmente ogni tipo di file può avere più estensioni. Ad esempio, i file immagine possono essere specificati sia come file JPEG che PNG, come questo:
openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";
Basta separare ciascuna estensione con un punto e virgola nella seconda parte (quella per il computer) - nella prima parte, puoi formattarla nel modo desiderato, ma la maggior parte degli sviluppatori sembra utilizzare la stessa notazione per entrambe le parti, come mostrato nell'esempio sopra.
Impostare la cartella iniziale
La directory iniziale utilizzata da OpenFileDialog è decisa da Windows, ma utilizzando la proprietà InitialDirectory , puoi sovrascriverla. Normalmente, si imposta questo valore su una directory specificata dall'utente, sulla directory dell'applicazione o, forse, solo sull'ultima directory utilizzata. Puoi impostarlo su un percorso in un formato stringa, come questo:
openFileDialog.InitialDirectory = @"c:\temp\";
Se si desidera utilizzare una delle cartelle speciali di Windows, ad es. nella directory Desktop, Documenti o Programmi, è necessario prestare particolare attenzione, dal momento che questi possono variare ad ogni versione di Windows e dipendono anche da quale utente è loggato. Il framework .NET può aiutarti, basta usare la classe Environment ed i relativi membri per la gestione di cartelle speciali:
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
In questo caso, ottengo il percorso per la cartella Documenti, ma se osservo l'enumerazione di SpecialFolder - contiene valori per un sacco di percorsi interessanti. Per un elenco completo, consulta questo articolo MSDN .
Files multipli
Se l'applicazione supporta più file aperti o se si desidera semplicemente utilizzare OpenFileDialog per selezionare più di un file alla volta, è necessario abilitare la proprietà Multiselect . Nel prossimo esempio, abbiamo fatto proprio questo, e per comodità, caro lettore, abbiamo applicato anche tutte le tecniche menzionate sopra, incluso il filtraggio e l'impostazione della directory iniziale:
<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));
}
}
}
}
Se verifichi questo codice, vedrai che ora puoi selezionare più file nella stessa directory, tenendo premuto Ctrl o Shift e facendo clic con il mouse. Una volta accettato, questo esempio aggiunge semplicemente i nomi di file al controllo ListBox, estraendo gli elementi dalla proprietà FileNames .
Sommario
Come puoi vedere, l'uso di OpenFileDialog in WPF è molto semplice e fa davvero molto lavoro. Siate consapevoli del fatto che per ridurre la quantità di linee di codice, in questi esempi non è stata attuata nessuna gestione delle eccezioni. Quando si lavora con i file e si eseguono attività di I / O in generale, si dovrebbe sempre controllare le eccezioni, in quanto possono facilmente verificarsi a causa di un file bloccato, percorso inesistente o problemi correlati.