TOC

This article has been localized into Portuguese by the community.

Diálogos:

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.


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!