¿Cómo muestro un cuadro de diálogo Guardar como en WPF?

101

Tengo un requisito en WPF / C # para hacer clic en un botón, recopilar algunos datos y luego ponerlos en un archivo de texto que el usuario puede descargar en su máquina. Puedo obtener la primera mitad de esto, pero ¿cómo se le indica a un usuario un cuadro de diálogo "Guardar como"? El archivo en sí será un archivo de texto simple.

Codificador desconocido
fuente
9
Entonces, realmente esta pregunta podría reducirse a "¿Cómo muestro un cuadro de diálogo Guardar como en WPF?"
RQDQ

Respuestas:

200

Hasta ahora, ambas respuestas se relacionan con la SaveFileDialogclase Silverlight ; la variante de WPF es un espacio de nombres bastante diferente y diferente.

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
fuente
23

SaveFileDialog está en el espacio de nombres Microsoft.Win32; podría ahorrarle los 10 minutos que me tomó para resolver esto.

criatura al revés
fuente
18

Aquí hay un código de muestra:

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
fuente
3

Usa la SaveFileDialogclase .

Daniel Hilgarth
fuente
@ Aaron: Gracias por la pista. Se corrigió el enlace para hacer referencia a la clase a la que me refería.
Daniel Hilgarth
1

Solo necesita crear un SaveFileDialog y llamar a su método ShowDialog.

Doce47
fuente
@ Aaron Gracias, me vinculé a la versión incorrecta. Actualicé mi respuesta para señalar la correcta ahora.
Doce47
1

Todos los ejemplos hasta ahora usan el espacio de nombres Win32, pero hay una 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)
{

}

Estoy usando un método de extensión para obtener el IWin32Windowdel control visual:

#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() también es un método de extensión, pero no vale la pena mencionarlo, ya que hay muchos ejemplos de uso de mayúsculas en la primera letra de una cadena.

Chuck Savage
fuente
¿Cómo lo usas GetIWin32Window?
edgarmtze