Làm cách nào để hiển thị hộp thoại Lưu dưới dạng trong WPF?


101

Tôi có yêu cầu trong WPF / C # là nhấp vào một nút, thu thập một số dữ liệu và sau đó đưa vào tệp văn bản mà người dùng có thể tải xuống máy của họ. Tôi có thể lấy nửa đầu của phần này, nhưng làm cách nào để nhắc người dùng bằng hộp thoại "Lưu dưới dạng"? Bản thân tệp sẽ là một tệp văn bản đơn giản.


9
Vì vậy, thực sự câu hỏi này có thể được thu hẹp thành "Làm cách nào để hiển thị hộp thoại Lưu dưới dạng trong WPF?"
RQDQ

Câu trả lời:


200

Do đó, cả hai câu trả lời đều liên kết đến SaveFileDialoglớp Silverlight ; các biến thể WPF là khá khác nhau chút và khác nhau namespace.

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;
}

23

SaveFileDialog nằm trong không gian tên Microsoft.Win32 - có thể giúp bạn tiết kiệm 10 phút mà tôi mất 10 phút để tìm ra điều này.


18

Đây là một số mã mẫu:

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

Bạn chỉ cần tạo một SaveFileDialog và gọi phương thức ShowDialog của nó.


@Aaron Cảm ơn, tôi đã liên kết với phiên bản sai. Tôi đã cập nhật câu trả lời của mình để chỉ ra câu đúng ngay bây giờ.
12 giờ 47

1

Tất cả các ví dụ cho đến nay đều sử dụng không gian tên Win32, nhưng có một giải pháp thay thế:

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)
{

}

Tôi đang sử dụng một phương thức mở rộng để lấy IWin32Windowtừ điều khiển trực quan:

#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() cũng là một phương thức mở rộng, nhưng không đáng nói vì có rất nhiều ví dụ về cách viết hoa chữ cái đầu tiên của một chuỗi.


Bạn sử dụng GetIWin32Windownhư thế nào?
edgarmtze
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.