WPF'de Farklı Kaydet iletişim kutusunu nasıl gösteririm?


102

WPF / C # 'de bir düğmeyi tıklamak, bazı verileri toplamak ve ardından kullanıcının makinelerine indirebileceği bir metin dosyasına koymak için bir gereksinimim var. Bunun ilk yarısını alabilirim, ancak bir kullanıcıyı "Farklı Kaydet" iletişim kutusuyla nasıl yönlendirirsiniz? Dosyanın kendisi basit bir metin dosyası olacaktır.


9
Yani gerçekten bu soru "WPF'de Farklı Kaydet iletişim kutusunu nasıl gösteririm?" Şeklinde daraltılabilir.
RQDQ

Yanıtlar:


202

Şimdiye kadar her iki yanıt da Silverlight SaveFileDialogsınıfıyla bağlantılıdır ; WPF varyant biraz farklı ve ad farklı olduğunu.

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, Microsoft.Win32 ad alanında - bunu anlamam için harcadığım 10 dakikayı size kurtarabilir.


18

İşte bazı örnek kodlar:

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

Bir SaveFileDialog oluşturmanız ve bunun ShowDialog yöntemini çağırmanız yeterlidir .


@Aaron Teşekkürler, yanlış sürüme bağlantı verdim. Cevabımı şimdi doğru olanı gösterecek şekilde güncelledim.
Twelve47

1

Şimdiye kadarki tüm örnekler Win32 ad alanını kullanıyor, ancak bir alternatif var:

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

}

IWin32WindowGörsel kontrolden almak için bir uzantı yöntemi kullanıyorum :

#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() aynı zamanda bir genişletme yöntemidir, ancak bir dizenin ilk harfini büyük harfle yazmanın birçok örneği olduğundan bahsetmeye değmez.


Nasıl kullanıyorsun GetIWin32Window ?
edgarmtze
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.