Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WinForms或WPF文件对话框提示打开、保存或取消我在代码隐藏中创建的文件_C#_Wpf_Winforms_File_Dialog - Fatal编程技术网

C#WinForms或WPF文件对话框提示打开、保存或取消我在代码隐藏中创建的文件

C#WinForms或WPF文件对话框提示打开、保存或取消我在代码隐藏中创建的文件,c#,wpf,winforms,file,dialog,C#,Wpf,Winforms,File,Dialog,我正在根据用户的数据创建一个特定用户操作的文件 现在我想给他一个自定义对话框,可以打开或保存文件,就像你下载文件时得到的一样 我想要的样本: 我知道“打开文件”对话框(可以从磁盘打开现有文件)和“保存文件”对话框(允许我保存文件),但是否有任何对话框或控件可以同时具有WPF或Winforms的选项? WPF是首选,但我也可以使用Winforms控件 编辑:感谢您的反馈。因为似乎没有内置控件或第三方控件,所以我选择自定义控件 你知道如何获得文件类型缩略图和文件类型长名称吗 按钮功能本身很简单,我

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

现在我想给他一个自定义对话框,可以打开或保存文件,就像你下载文件时得到的一样

我想要的样本:

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

编辑:感谢您的反馈。因为似乎没有内置控件或第三方控件,所以我选择自定义控件


你知道如何获得文件类型缩略图和文件类型长名称吗


按钮功能本身很简单,我可以管理它。

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

webBrowser1.Navigate(@"C:\windows\temp\somefile.xyz");
如果不能令人满意,您需要滚动自己的对话框


创建自定义下载对话框

在决定实现自定义对话框的情况下,可以使用来提取有关文件的信息,包括图标和文件类型描述

例如,首先声明和结构以及必需的常量:

[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();
然后您可以创建这样的对话框:

下载示例

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


就像你需要发明轮子一样。乍一看,用三个按钮实现用户控件应该很容易。您遇到了什么问题?我只是想知道是否存在我可能不知道的现有控件?或者可能是第三方或现有的自定义实现…好的,有一个用于Web的,但我无法使用该实现。谢谢,我现在使用自定义方法。有什么办法可以获得文件类型缩略图和文件类型名称吗?按钮功能本身很简单,我可以管理。谢谢,是的,这是我第一次尝试,但我不支持所有文件类型,然后要求我保存/下载。另外,它会丢失格式,有时无法正确显示内容。这就是为什么我总是想到用默认处理程序打开文件。我可以做的很简单:System.Diagnostics.Process.Start(filepath);因此,您需要创建自己的自定义对话框,其中包含几个按钮以打开、保存或取消该对话框。我只是想要一个Winforms/WPF等效的Web文件下载控件。我共享了自定义对话框方法的解决方案。