当您希望保存文件时,SaveFileDialog将帮助您选择位置和文件名。它的工作原理与我们在上一篇文章中使用的OpenFileDialog非常相似,但有一些细微的差别。就像OpenFileDialog一样,SaveFileDialog是一个常见Windows对话框的包装器,这意味着无论用户是否在应用程序中启动它,用户都会看到大致相同的对话框。在记事本中。
为了解决问题,让我们从使用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);
}
}
}
如您所见,它主要是关于实例化SaveFileDialog然后调用ShowDialog()方法。如果它返回true,我们使用FileName属性(它将包含所选路径以及用户输入的文件名)作为将内容写入的路径。
如果单击“保存”按钮,则会看到这样的对话框,具体取决于您使用的Windows版本:
从第一个示例中可以看出,我手动将.txt扩展名添加到我想要的文件名,主要是因为“另存为类型”组合框为空。就像OpenFileDialog一样,这个框是通过Filter属性控制的,它也以完全相同的方式使用。
saveFileDialog.Filter = "Text file (*.txt)|*.txt|C# file (*.cs)|*.cs";
有关Filter属性格式的更多详细信息,请参阅OpenFileDialog上的上一篇文章,其中详细介绍了该文章。
使用上面的过滤器,生成的SaveFileDialog将如下所示:
有了这个,您可以在不指定扩展名的情况下编写文件名 - 它将取自过滤器组合框中的选定文件类型。这也向用户表明您的应用程序支持哪种文件格式,这当然很重要。
SaveFileDialog使用的初始目录由Windows决定,但通过使用InitialDirectory 属性,您可以覆盖它。您通常会将此值设置为用户指定的目录,应用程序目录或者可能只是上次使用的目录。您可以将其设置为字符串格式的路径,如下所示:
saveFileDialog.InitialDirectory = @"c:\temp\";
如果要在Windows上使用某个特殊文件夹,例如在桌面,我的文档或程序文件目录中,您必须特别小心,因为这些可能因Windows的每个版本而异,也取决于登录的用户。但.NET框架可以帮助您,只需使用环境用于处理特殊文件夹的类及其成员:
saveFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
在这种情况下,我获取了My Documents文件夹的路径,但是看看了SpecialFolder枚举 - 它包含许多有趣路径的值。有关完整列表,请参阅此内容MSDN article.
除了本文中已经提到的选项之外,我还想提请您注意以下属性,这些属性将帮助您根据需要定制SaveFileDialog:
AddExtension - 默认为true,并确定SaveFileDialog是否应自动为文件名附加扩展名(如果用户省略)。扩展名将基于所选的过滤器,除非这是不可能的,在这种情况下,它将回退到DefaultExt属性(如果指定)。如果您希望应用程序能够保存没有文件扩展名的文件,则可能必须禁用此选项。
OverwritePrompt - 默认为true,并确定如果用户输入的文件名将导致现有文件被覆盖,SaveFileDialog是否应该要求确认。除非在非常特殊的情况下,您通常希望启用此选项。
Title - 如果您想在对话框中使用自定义标题,则可以覆盖此属性。它默认为“另存为”或本地化的等效项,该属性对OpenFileDialog也有效。
ValidateNames - 默认为true,除非它被禁用,否则它将确保用户在允许用户继续之前只输入有效的Windows文件名。