【问题标题】:C# WinForms OR WPF File Dialog Prompt to Open or Save or Cancel for a file that I am creating in the code behindC# WinForms 或 WPF 文件对话框提示打开或保存或取消我在后面的代码中创建的文件
【发布时间】:2018-06-16 06:30:24
【问题描述】:

我正在根据特定用户操作从用户数据创建一个文件。

现在我想给他一个自定义对话框,以便能够打开或保存文件,有点像你实际下载文件时得到的。

我想要的样本:

我知道打开文件对话框(可以从磁盘打开现有文件)和保存文件对话框,它允许我保存文件,但是是否有任何对话框或控件可以同时具有 WPF 选项或Winforms? WPF 将是首选,但我也可以使用 Winforms 控件。

编辑:感谢您的反馈。由于似乎没有内置或第 3 方控件,我将使用自定义控件。

任何想法如何获得文件类型缩略图和文件类型长名称?

按钮功能本身很简单,我可以做到。

【问题讨论】:

  • 就像你需要发明一个轮子一样。乍一看,用三个按钮实现用户控件应该很容易。你遇到了什么问题?
  • 我只是想知道是否存在我可能不知道的现有控件?或者可能是第三方或现有的自定义实现......
  • AFAIK,有一个用于 Web,但我无法使用那个。
  • 谢谢,我现在使用自定义方法。
  • 知道如何获取文件类型缩略图和文件类型名称吗? Button 功能本身很简单,我可以做到。

标签: c# wpf winforms file dialog


【解决方案1】:

对于未设置为在浏览器中打开的文件类型,您可以依赖一个不可见的WebBroser 控件并调用Navigate 方法并将临时文件名传递给它:

webBrowser1.Navigate(@"C:\windows\temp\somefile.xyz");

如果不满意,您需要滚动自己的对话框。


创建自定义下载对话框

如果您决定实现自定义对话框,您可以使用SHGetFileInfo 提取有关文件的信息,包括图标和文件类型描述。

例如,首先声明SHGetFileInfoSHFILEINFO结构和所需的常量:

[DllImport("shell32")]
private static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes,
    out SHFILEINFO psfi, uint cbFileInfo, uint uflags);

[StructLayout(LayoutKind.Sequential)]
private struct SHFILEINFO {
    public IntPtr hIcon;
    public int iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
}

private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080;
private const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; 
private const uint SHGFI_ICON = 0x000000100;  
private const uint SHGFI_DISPLAYNAME = 0x000000200; 
private const uint SHGFI_TYPENAME = 0x000000400;    
private const uint SHGFI_ATTRIBUTES = 0x000000800; 

那么你可以这样使用方法:

var info = new SHFILEINFO();
SHGetFileInfo(filename, FILE_ATTRIBUTE_NORMAL, out info, (uint)Marshal.SizeOf(info),
    SHGFI_ICON | SHGFI_DISPLAYNAME | SHGFI_TYPENAME | SHGFI_USEFILEATTRIBUTES);

var fileDisplayName = info.szDisplayName;
var fileTypeName = info.szTypeName;
var fileTypeImage = Icon.FromHandle(info.hIcon).ToBitmap();

那么你就可以有这样的对话框了:

下载示例

您可以从以下存储库下载一个工作示例:

【讨论】:

  • 谢谢,是的,这是我尝试的第一个,但我不支持所有文件类型,然后要求我保存/下载。另外,它会丢失格式并且有时无法正确显示内容。
  • 这就是为什么,我想总是在其默认处理程序中打开文件。我可以做的很简单:System.Diagnostics.Process.Start(filepath);
  • 因此您需要创建自己的自定义对话框,其中包含几个按钮来打开或保存或取消对话框。
  • 我只是想要一个 Winforms/WPF 等价于 Web 可用的 FileDownload 控件。
  • 我分享了自定义对话框方法的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多