2011-04-11 63 views
87

我在WPF/C#中有一个要求,点击一个按钮,收集一些数据,然后把它放在一个文本文件中,用户可以下载到他们的机器。我可以得到前半部分,但是如何通过“另存为”对话框提示用户?该文件本身将是一个简单的文本文件。如何在WPF中显示另存为对话框?

+7

所以真的这个问题可以缩小到“如何在WPF中显示另存为对话框?” – RQDQ 2011-04-11 14:43:46

回答

162

这两个答案到目前为止链接到Silverlight SaveFileDialog类; WPF variant是相当不同和不同的命名空间。

Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog(); 
dlg.FileName = "Document"; // Default file name 
dlg.DefaultExt = ".text"; // Default file extension 
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension 

// Show save file dialog box 
Nullable<bool> result = dlg.ShowDialog(); 

// Process save file dialog box results 
if (result == true) 
{ 
    // Save document 
    string filename = dlg.FileName; 
} 
3
+0

@Aaron:谢谢你的提示。更正了链接以引用我的意思。 – 2011-04-11 14:50:12

1

你只需要创建一个SaveFileDialog,并调用它的ShowDialog方法。

+0

-1这是SL;不是WPF – 2011-04-11 14:47:33

+0

@Aaron谢谢,我链接到了错误的版本。我已经更新了我的答案,现在指出正确的答案。 – Twelve47 2011-04-11 14:50:26

20

SaveFileDialog位于Microsoft.Win32命名空间中 - 可能会为您节省10分钟的时间,它使我能够明白这一点。

13

下面是一些示例代码:

string fileText = "Your output text"; 

SaveFileDialog dialog = new SaveFileDialog() 
{ 
    Filter = "Text Files(*.txt)|*.txt|All(*.*)|*" 
}; 

if (dialog.ShowDialog() == true) 
{ 
    File.WriteAllText(dialog.FileName, fileText); 
} 
1

所有到目前为止的例子使用Win32命名空间,但有一个选择:

FileInfo file = new FileInfo("image.jpg"); 
var dialog = new System.Windows.Forms.SaveFileDialog(); 
dialog.FileName = file.Name; 
dialog.DefaultExt = file.Extension; 
dialog.Filter = string.Format("{0} images ({1})|*{1}|All files (*.*)|*.*", 
    file.Extension.Substring(1).Capitalize(), 
    file.Extension); 
dialog.InitialDirectory = file.DirectoryName; 

System.Windows.Forms.DialogResult result = dialog.ShowDialog(this.GetIWin32Window()); 
if (result == System.Windows.Forms.DialogResult.OK) 
{ 

} 

我使用的扩展方法从视觉控制中获得IWin32Window

#region Get Win32 Handle from control 
public static System.Windows.Forms.IWin32Window GetIWin32Window(this System.Windows.Media.Visual visual) 
{ 
    var source = System.Windows.PresentationSource.FromVisual(visual) as System.Windows.Interop.HwndSource; 
    System.Windows.Forms.IWin32Window win = new OldWindow(source.Handle); 
    return win; 
} 

private class OldWindow : System.Windows.Forms.IWin32Window 
{ 
    private readonly System.IntPtr _handle; 
    public OldWindow(System.IntPtr handle) 
    { 
     _handle = handle; 
    } 

    System.IntPtr System.Windows.Forms.IWin32Window.Handle 
    { 
     get { return _handle; } 
    } 
} 
#endregion 

Capitalize()也是一种扩展方法,但并不值得一提,因为有大量的例子将字符串的首字母大写。

+0

你如何使用'GetIWin32Window'? – cMinor 2015-10-08 23:49:40