¿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.


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;
}

23

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


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


1

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


@ 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.


¿Cómo lo usas GetIWin32Window?
edgarmtze
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.