How do I show a Save As dialog in WPF?

后端 未结 6 2093
鱼传尺愫
鱼传尺愫 2020-12-13 08:46

I have a requirement in WPF/C# to click on a button, gather some data and then put it in a text file that the user can download to their machine. I can get the first half of

6条回答
  •  北海茫月
    2020-12-13 09:16

    All the examples so far use the Win32 namespace, but there is an alternative:

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

    I'm using an extension method to get the IWin32Window from the visual control:

    #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() is also an extension method, but not worth mentioning as there are plenty of examples of capitalizing the first letter of a string out there.

提交回复
热议问题