web-dev-qa-db-fra.com

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

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

100
Unknown Coder

Jusqu'à présent, les deux réponses sont liées à Silverlight SaveFileDialogclass; le variante de WPF est un espace de noms un peu 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;
}
191
Aaron McIver

SaveFileDialog est dans l’espace de noms Microsoft.Win32. Vous économiserez peut-être les 10 minutes qu’il m’a fallu pour résoudre ce problème.

21
upsidedowncreature

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);
}
17
RQDQ

Utilisez le SaveFileDialog class .

3
Daniel Hilgarth

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

1
Twelve47

Jusqu'à présent, tous les exemples 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 IWin32Window À partir 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 aussi une méthode d'extension, mais il ne faut pas en parler, car il existe de nombreux exemples de majuscules de la première lettre d'une chaîne.

1
Chuck Savage