2011-04-11 32 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

相關問題