Wie zeige ich ein Dialogfeld Speichern unter in WPF an?


101

Ich habe in WPF / C # die Anforderung, auf eine Schaltfläche zu klicken, einige Daten zu sammeln und sie dann in eine Textdatei abzulegen, die der Benutzer auf seinen Computer herunterladen kann. Ich kann die erste Hälfte davon erhalten, aber wie können Sie einen Benutzer mit einem Dialogfeld "Speichern unter" auffordern? Die Datei selbst ist eine einfache Textdatei.


9
Diese Frage könnte also wirklich auf "Wie zeige ich ein Dialogfeld" Speichern unter "in WPF?" Eingeschränkt werden.
RQDQ

Antworten:


200

Beide Antworten sind bisher mit der Silverlight- SaveFileDialogKlasse verknüpft . Die WPF-Variante ist ein ganz anderer und unterschiedlicher 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 befindet sich im Microsoft.Win32-Namespace - spart Ihnen möglicherweise die 10 Minuten, die ich benötigt habe, um dies herauszufinden.


18

Hier ist ein Beispielcode:

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

Sie müssen nur einen SaveFileDialog erstellen und dessen ShowDialog-Methode aufrufen.


@ Aaron Danke, ich habe auf die falsche Version verlinkt. Ich habe meine Antwort aktualisiert, um jetzt die richtige zu finden.
Twelve47

1

Alle bisherigen Beispiele verwenden den Win32-Namespace, es gibt jedoch eine Alternative:

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

}

Ich verwende eine Erweiterungsmethode, um IWin32Windowdie visuelle Kontrolle zu erhalten:

#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() ist auch eine Erweiterungsmethode, aber nicht erwähnenswert, da es viele Beispiele für die Großschreibung des ersten Buchstabens einer Zeichenfolge gibt.


Wie benutzt man GetIWin32Window?
Edgarmtze
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.