Come faccio a visualizzare una finestra di dialogo Salva con nome in WPF?


101

Ho un requisito in WPF / C # per fare clic su un pulsante, raccogliere alcuni dati e quindi inserirli in un file di testo che l'utente può scaricare sul proprio computer. Posso ottenere la prima metà di questo, ma come chiedo a un utente con una finestra di dialogo "Salva con nome"? Il file stesso sarà un semplice file di testo.


9
Quindi in realtà questa domanda potrebbe essere ridotta a "Come faccio a mostrare una finestra di dialogo Salva con nome in WPF?"
RQDQ

Risposte:


200

Entrambe le risposte finora sono collegate alla SaveFileDialogclasse Silverlight ; la variante WPF è abbastanza diversa e con uno spazio dei nomi diverso.

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 è nello spazio dei nomi Microsoft.Win32 - potrebbe farti risparmiare i 10 minuti che mi ci sono voluti per capirlo.


18

Ecco un po 'di codice di esempio:

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

Hai solo bisogno di creare un SaveFileDialog e chiamare il suo metodo ShowDialog.


@Aaron Grazie, ho collegato la versione sbagliata. Ho aggiornato la mia risposta per indicare quella corretta ora.
Dodici47

1

Tutti gli esempi finora utilizzano lo spazio dei nomi Win32, ma esiste un'alternativa:

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

}

Sto usando un metodo di estensione per ottenere IWin32Windowdal controllo visivo:

#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() è anche un metodo di estensione, ma non vale la pena menzionarlo poiché ci sono molti esempi di capitalizzazione della prima lettera di una stringa.


Come si usa GetIWin32Window?
edgarmtze
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.