WPF SaveFileDialog DefaultExt 被忽略了吗?

Posted

技术标签:

【中文标题】WPF SaveFileDialog DefaultExt 被忽略了吗?【英文标题】:WPF SaveFileDialog DefaultExt ignored? 【发布时间】:2011-05-23 23:33:37 【问题描述】:
var dlg = new SaveFileDialog();
dlg.FileName = "graph";
dlg.DefaultExt = ".bmp";
dlg.Filter = "PNG|*.png|DOT|*.dot|Windows Bitmap Format|*.bmp|GIF|*.gif|JPEG|*.jpg|PDF|*.pdf|Scalable Vector Graphics|*.svg|Tag Image File Format|*.tiff";

扩展名始终默认为.png。如果有Filter,似乎DefaultExt 会被忽略;那么它只是默认为列表中的第一个选项。

有没有办法强制它真正尊重默认分机?

【问题讨论】:

【参考方案1】:

您应该设置FilterIndex 属性而不是DefaultExt。如果你还想使用DefaultExt,你可以手动将其转换为合适的过滤器索引:

public static void UseDefaultExtAsFilterIndex(FileDialog dialog)

    var ext = "*." + dialog.DefaultExt;
    var filter = dialog.Filter;
    var filters = filter.Split('|');
    for(int i = 1; i < filters.Length; i += 2)
    
        if(filters[i] == ext)
        
            dialog.FilterIndex = 1 + (i - 1) / 2;
            return;
        
    


var dlg = new SaveFileDialog();
dlg.FileName = "graph";
dlg.DefaultExt = ".bmp";
dlg.Filter = "PNG|*.png|DOT|*.dot|Windows Bitmap Format|*.bmp|GIF|*.gif|JPEG|*.jpg|PDF|*.pdf|Scalable Vector Graphics|*.svg|Tag Image File Format|*.tiff";
UseDefaultExtAsFilterIndex(dlg);
dlg.ShowDialog();

【讨论】:

【参考方案2】:

DefaultExt 是用户选择没有扩展名的文件名时将使用的扩展名(至少这是我从 MSDN 中阅读描述的理解)。

当您的应用程序的用户 指定不带 扩展名,FileDialog 附加一个 文件名的扩展名。

您可能必须将bmp 设为过滤器列表中的第一项。

【讨论】:

【参考方案3】:

我晚了几年,但巧合的是,我在查看此question 的代码时找到了问题的解决方案。

在那里他指定了没有. 的扩展名。然后我查看了microsoft documentation。在示例中,还指定了 DefaultExt,但没有指定 .

如果用. 指定DefaultExtFileDialog 将自动选择过滤器的第一个扩展名。

DefaultExt 应设置为不带. 的扩展名。 这意味着在您的示例中 dlg.DefaultExt = ".bmp"; 您需要将 ".bmp" 更改为 "bmp"...

【讨论】:

【参考方案4】:

根据 API 有不同的解释,但似乎工作相似; DefaultExt 用于当用户选择没有扩展名的文件名并且选择的过滤器是通配符过滤器,例如(*.*)

System.Windows.Forms.FileDialog.DefaultExt(MSDN):

当您的应用程序的用户指定一个不带扩展名的文件名时,FileDialog 会在文件名后附加一个扩展名。 使用的扩展名由 Filter 和 DefaultExt 属性决定。如果在 FileDialog 中选择了过滤器并且过滤器指定了扩展名,则使用该扩展名。如果所选过滤器使用通配符代替扩展名,则使用 DefaultExt 属性中指定的扩展名。

Microsoft.Win32.FileDialog.DefaultExt(MSDN):

默认情况下,AddExtension 属性尝试确定扩展名以从 Filter 属性中过滤显示的文件列表。如果无法通过 Filter 属性确定扩展名,则将使用 DefaultExt。

【讨论】:

以上是关于WPF SaveFileDialog DefaultExt 被忽略了吗?的主要内容,如果未能解决你的问题,请参考以下文章

WPF SaveFileDialog DefaultExt 被忽略了吗?

(12) WPF 对话框控件

关于WPF中openfiledialog文件多选

在 Vista/Windows 7 WPF FileDialog.Filter 中隐藏扩展

如何使用 SaveFileDialog 的过滤器

如果取消,为啥我的 SaveFileDialog 会再次显示?