This article has been localized into Portuguese by the community.
O SaveFileDialog
O SaveFileDialog ajudará você a selecionar um local e um nome de arquivo quando desejar salvar um arquivo. Ele funciona e se parece muito com o OpenFileDialog que usamos no artigo anterior, com algumas diferenças sutis. Assim como o OpenFileDialog, o SaveFileDialog é um wrapper em torno de uma caixa de diálogo comum do Windows, o que significa que seus usuários verão mais ou menos a mesma caixa de diálogo, quer inicie-a em seu aplicativo ou, e. no bloco de notas.
Um simples exemplo de SaveFileDialog
Para começar, vamos começar com um exemplo muito simples sobre como usar o SaveFileDialog:
<Window x:Class="WpfTutorialSamples.Dialogs.SaveFileDialogSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SaveFileDialogSample" Height="300" Width="300">
<DockPanel Margin="10">
<WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
<Button Name="btnSaveFile" Click="btnSaveFile_Click">Save file</Button>
</WrapPanel>
<TextBox Name="txtEditor" TextWrapping="Wrap" AcceptsReturn="True" ScrollViewer.VerticalScrollBarVisibility="Auto" />
</DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;
namespace WpfTutorialSamples.Dialogs
{
public partial class SaveFileDialogSample : Window
{
public SaveFileDialogSample()
{
InitializeComponent();
}
private void btnSaveFile_Click(object sender, RoutedEventArgs e)
{
SaveFileDialog saveFileDialog = new SaveFileDialog();
if(saveFileDialog.ShowDialog() == true)
File.WriteAllText(saveFileDialog.FileName, txtEditor.Text);
}
}
}
Como você pode ver, é principalmente sobre como instanciar o SaveFileDialog e depois chamar o método ShowDialog(). Se retornar true, usamos a propriedade FileName (que conterá o caminho selecionado, bem como o nome do arquivo inserido pelo usuário) como o caminho para gravar nosso conteúdo.
Se você clicar no botão salvar, verá uma caixa de diálogo como essa, dependendo da versão do Windows que estiver usando:
Filter
Como você pode ver no primeiro exemplo, eu adicionei manualmente uma extensão .txt ao meu nome de arquivo desejado, principalmente porque a caixa de combinação "Salvar como tipo" está vazia. Assim como para o OpenFileDialog, essa caixa é controlada por meio da propriedade Filter e também é usada da mesma maneira.
saveFileDialog.Filter = "Text file (*.txt)|*.txt|C# file (*.cs)|*.cs";
Para mais detalhes sobre o formato da propriedade Filter, consulte o artigo anterior sobre o OpenFileDialog, onde é explicado em detalhes.
Com um filtro como o acima, o SaveFileDialog resultante será assim:
Com isso, você pode escrever nomes de arquivo sem especificar a extensão - ele será retirado do tipo de arquivo selecionado na caixa de combinação do filtro. Isso também indica ao usuário quais formatos de arquivo seu aplicativo suporta, o que é obviamente importante.
Definindo o diretório inicial
O diretório inicial usado pelo SaveFileDialog é 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:
saveFileDialog.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 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:
saveFileDialog.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.
Options
Além das opções já mencionadas neste artigo, quero chamar sua atenção para as seguintes propriedades, que ajudarão você a adaptar o SaveFileDialog às suas necessidades:
AddExtension - o padrão é true e determina se o SaveFileDialog deve anexar automaticamente uma extensão ao nome do arquivo, se o usuário omitir. A extensão será baseada no filtro selecionado, a menos que isso não seja possível. Nesse caso, ela retornará à propriedade DefaultExt (se especificada). Se você quiser que seu aplicativo seja capaz de salvar arquivos sem extensões de arquivo, talvez seja necessário desativar essa opção.
OverwritePrompt - o padrão é true e determina se o SaveFileDialog deve solicitar uma confirmação se o usuário inserir um nome de arquivo que resultará na sobrescrita de um arquivo existente. Você normalmente desejará deixar essa opção ativada, exceto em situações muito especiais.
Title - você pode substituir essa propriedade se quiser um título personalizado em sua caixa de diálogo. O padrão é "Salvar como" ou o equivalente localizado e a propriedade também é válida para o OpenFileDialog.
ValidateNames - o padrão é true e, a menos que seja desativado, ele garante que o usuário insira apenas nomes de arquivos válidos do Windows antes de permitir que o usuário continue.