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.

Unbekannter Codierer
quelle
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;
}
Aaron McIver
quelle
23

SaveFileDialog befindet sich im Microsoft.Win32-Namespace - spart Ihnen möglicherweise die 10 Minuten, die ich benötigt habe, um dies herauszufinden.

Upsidedowncreature
quelle
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);
}
RQDQ
quelle
3

Verwenden Sie die SaveFileDialogKlasse .

Daniel Hilgarth
quelle
@ Aaron: Danke für den Hinweis. Der Link wurde korrigiert, um auf die Klasse zu verweisen, die ich meinte.
Daniel Hilgarth
1

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

Zwölf47
quelle
@ 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.

Chuck Savage
quelle
Wie benutzt man GetIWin32Window?
Edgarmtze