2011-04-11 10 views
87

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

+7

Entonces, realmente, esta pregunta podría reducirse a "¿Cómo se muestra un cuadro de diálogo Guardar como en WPF?" – RQDQ

Respuesta

162

Ambas respuestas hasta ahora se vinculan a la clase SaveFileDialog de Silverlight; el WPF variant es bastante diferente y tiene un espacio de nombres 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; 
} 
3
+0

@ Aaron: Gracias por la pista. Corregí el enlace para hacer referencia a la clase que quise decir. –

1

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

+0

-1 Eso es para SL; no WPF –

+0

@ Aaron Gracias, he vinculado a la versión incorrecta. He actualizado mi respuesta para señalar la correcta ahora. – Twelve47

20

SaveFileDialog está en el espacio de nombres de Microsoft.Win32 - podría ahorrarle los 10 minutos que me llevó averiguarlo.

13

Aquí hay un código de ejemplo:

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

Todos los ejemplos hasta ahora utilizan el espacio de nombres de Win32, pero no 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 IWin32Window desde el 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() es también un método de extensión, pero no vale la pena mencionarlo ya que hay muchos ejemplos de mayúsculas en la primera letra de una cadena.

+0

¿Cómo se usa 'GetIWin32Window'? – cMinor

Cuestiones relacionadas