Bagaimana cara menampilkan dialog Simpan Sebagai di WPF?

101

Saya memiliki persyaratan di WPF / C # untuk mengklik tombol, mengumpulkan beberapa data dan kemudian memasukkannya ke dalam file teks yang dapat diunduh pengguna ke mesin mereka. Saya bisa mendapatkan paruh pertama ini, tetapi bagaimana Anda meminta pengguna dengan kotak dialog "Simpan Sebagai"? File itu sendiri akan menjadi file teks sederhana.

Pembuat Kode Tidak Diketahui
sumber
9
Jadi sebenarnya pertanyaan ini bisa dipersempit menjadi "Bagaimana cara menampilkan dialog Simpan Sebagai di WPF?"
RQDQ

Jawaban:

200

Kedua jawaban sejauh ini terkait dengan SaveFileDialogkelas Silverlight ; yang varian WPF cukup berbeda sedikit dan berbeda 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;
}
Aaron McIver
sumber
23

SaveFileDialog ada di namespace Microsoft.Win32 - mungkin menghemat waktu 10 menit yang saya perlukan untuk mengetahuinya.

upsidedowncreature
sumber
18

Berikut beberapa contoh kode:

string fileText = "Your output text";

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

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

Gunakan SaveFileDialogkelas .

Daniel Hilgarth
sumber
@ Aaron: Terima kasih atas petunjuknya. Memperbaiki tautan untuk merujuk kelas yang saya maksud.
Daniel Hilgarth
1

Anda hanya perlu membuat SaveFileDialog , dan memanggil metode ShowDialog-nya.

Dua belas47
sumber
@Aaron Terima kasih, saya menautkan ke versi yang salah. Saya telah memperbarui jawaban saya untuk menunjukkan yang benar sekarang.
Twelve47
1

Semua contoh sejauh ini menggunakan namespace Win32, tetapi ada alternatif lain:

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

}

Saya menggunakan metode ekstensi untuk mendapatkan IWin32Windowdari kontrol visual:

#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() juga merupakan metode ekstensi, tetapi tidak perlu disebutkan karena ada banyak contoh penggunaan huruf besar pada huruf pertama dari string di luar sana.

Chuck Savage
sumber
Bagaimana cara Anda menggunakannya GetIWin32Window?
edgarmtze