Comment afficher une boîte de dialogue Enregistrer sous dans WPF?

102

J'ai une exigence dans WPF / C # pour cliquer sur un bouton, collecter des données, puis les mettre dans un fichier texte que l'utilisateur peut télécharger sur sa machine. Je peux obtenir la première moitié de ceci, mais comment inviter un utilisateur avec une boîte de dialogue «Enregistrer sous»? Le fichier lui-même sera un simple fichier texte.

Codeur inconnu
la source
9
Donc, vraiment, cette question pourrait être réduite à "Comment afficher une boîte de dialogue Enregistrer sous dans WPF?"
RQDQ

Réponses:

202

Jusqu'à présent, les deux réponses sont liées à la SaveFileDialogclasse Silverlight ; la variante WPF est un espace de noms assez différent et différent.

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
la source
23

SaveFileDialog est dans l'espace de noms Microsoft.Win32 - pourrait vous faire gagner les 10 minutes qu'il m'a fallu pour comprendre cela.

créature à l'envers
la source
18

Voici un exemple de code:

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
la source
3

Utilisez la SaveFileDialogclasse .

Daniel Hilgarth
la source
@Aaron: Merci pour l'indice. Correction du lien pour référencer la classe que je voulais dire.
Daniel Hilgarth
1

Il vous suffit de créer un SaveFileDialog et d'appeler sa méthode ShowDialog.

Douze47
la source
@Aaron Merci, j'ai lié à la mauvaise version. J'ai mis à jour ma réponse pour pointer la bonne maintenant.
Twelve47
1

Tous les exemples jusqu'à présent utilisent l'espace de noms Win32, mais il existe une 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)
{

}

J'utilise une méthode d'extension pour obtenir le à IWin32Windowpartir du contrôle visuel:

#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() est également une méthode d'extension, mais cela ne vaut pas la peine d'être mentionné car il existe de nombreux exemples de mise en majuscule de la première lettre d'une chaîne.

Chuck Savage
la source
Comment l'utilisez vous GetIWin32Window?
edgarmtze