This article has been localized into Portuguese by the community.
O OpenFileDialog
Sempre que você abrir ou salvar um arquivo em praticamente qualquer aplicativo do Windows, verá aproximadamente os mesmos diálogos para fazer isso. A razão é claro que esses diálogos são parte da API do Windows e, portanto, também acessíveis aos desenvolvedores na plataforma Windows.
Para o WPF, você encontrará caixas de diálogo padrão para abrir e salvar arquivos no namespace Microsoft.Win32. Neste artigo, vamos nos concentrar na classe OpenFileDialog, que facilita muito a exibição de um diálogo para abrir um ou vários arquivos.
Exemplo simples de OpenFileDialog
Vamos começar usando o OpenFileDialog sem nenhuma opção extra, para carregar um arquivo em um controle 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);
}
}
}
Depois de clicar no botão Abrir arquivo, o OpenFileDialog será instanciado e mostrado. Dependendo de qual versão do Windows você está usando e do tema selecionado, será algo parecido com isto:
O ShowDialog() retornará um valor booleano anulável, o que significa que ele pode ser falso, verdadeiro ou nulo. Se o usuário seleciona um arquivo e pressiona "Abrir", o resultado é True e, nesse caso, tentamos carregar o arquivo no controle TextBox. Obtemos o caminho completo do arquivo selecionado usando a propriedade FileName do OpenFileDialog.
Filter
Normalmente, quando você deseja que seu usuário abra um arquivo em seu aplicativo, você deseja limitá-lo a um ou dois tipos de arquivo. Por exemplo, o Word abre principalmente o arquivo do Word (com a extensão .doc ou .docx) e o Bloco de Notas na maioria dos arquivos de texto abertos (com a extensão .txt).
Você pode especificar um filtro para o OpenFileDialog para indicar ao usuário quais tipos de arquivo eles devem abrir em seu aplicativo, além de limitar os arquivos mostrados para uma melhor visão geral. Isso é feito com a propriedade Filter, que podemos adicionar ao exemplo acima, logo após inicializar o diálogo, assim:
openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
Este é o resultado:
Observe como a caixa de diálogo agora tem uma caixa de combinação para selecionar os tipos de arquivo e que os arquivos mostrados são limitados àqueles com as extensões especificadas pelo tipo de arquivo selecionado.
O formato para especificar o filtro pode parecer um pouco estranho à primeira vista, mas funciona especificando uma versão legível das extensões de arquivo desejadas e, em seguida, uma para o computador analisar facilmente, separada por um caractere pipe (|). Se você quiser mais de um tipo de arquivo, como fazemos no exemplo acima, cada conjunto de informações também é separado por um caractere de pipe.
Então, para resumir, a parte seguinte significa que queremos que o tipo de arquivo seja chamado de "Arquivos de texto (* .txt)" (a extensão entre parênteses é uma cortesia para o usuário, então eles sabem quais extensões estão incluídas) ) e a segunda parte diz ao diálogo para mostrar arquivos com uma extensão .txt:
Text files (*.txt)|*.txt
Cada tipo de arquivo pode ter várias extensões. Por exemplo, arquivos de imagem podem ser especificados como arquivos JPEG e PNG, assim:
openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";
Simplesmente separe cada extensão com um ponto e vírgula na segunda parte (a do computador) - na primeira parte, você pode formatá-la da maneira que quiser, mas a maioria dos desenvolvedores parece usar a mesma notação para ambas as partes, como visto em o exemplo acima.
Definindo o diretório inicial
O diretório inicial usado pelo OpenFileDialog é decidido pelo Windows, mas usando a propriedade InitialDirectory, você pode substituí-lo. Geralmente, você definirá esse valor para um diretório especificado pelo usuário, o diretório do aplicativo ou talvez apenas para o diretório usado pela última vez. Você pode configurá-lo para um caminho em um formato de string, assim:
openFileDialog.InitialDirectory = @"c:\temp\";
Se você quiser usar uma das pastas especiais no Windows, por exemplo Desktop, Meus Documentos ou o diretório Arquivos de Programas, você deve ter um cuidado especial, pois eles podem variar de acordo com cada versão do Windows e também dependem de qual usuário está logado. O .NET framework pode ajudá-lo, apenas use a classe Enviroment e seus membros para lidar com pastas especiais:
openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Nesse caso, obtenho o caminho para a pasta Meus Documentos, mas vejo a enumeração SpecialFolder - ela contém valores para muitos caminhos interessantes. Para obter uma lista completa, consulte este MSDN article.
Múltiplos arquivos
Se o seu aplicativo suportar vários arquivos abertos ou se você simplesmente quiser usar o OpenFileDialog para selecionar mais de um arquivo por vez, será necessário ativar a propriedade Multiselect. No próximo exemplo, fizemos exatamente isso e, como uma cortesia para você, caro leitor, também aplicamos todas as técnicas mencionadas acima, incluindo a filtragem e a configuração do diretório inicial:
<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 você testar esse código, verá que agora é possível selecionar vários arquivos no mesmo diretório, pressionando Ctrl ou Shift e clicando com o mouse. Uma vez aceito, este exemplo simplesmente adiciona os nomes de arquivos ao controle ListBox, fazendo um loop através da propriedade FileNames.
Resumo
Como você pode ver, usar o OpenFileDialog no WPF é muito fácil e realmente economiza muito trabalho para você. Por favor, esteja ciente de que, para reduzir a quantidade de linhas de código, nenhum tratamento de exceção é feito nesses exemplos. Ao trabalhar com arquivos e executar tarefas de E/S em geral, você deve sempre procurar exceções, pois elas podem ocorrer facilmente devido a um arquivo bloqueado, caminho inexistente ou problemas relacionados.