9
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. DefaultExt如果有Filter;似乎会被忽略 那么它只是默认为列表中的第一个选项。

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

4

4 回答 4

12

您应该设置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();
于 2011-05-23T23:49:15.777 回答
6

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

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

您可能必须bmp在过滤器列表中创建第一项。

于 2011-05-23T23:36:46.280 回答
2

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

在那里,他指定了不带.. 然后我查看了microsoft 文档。在示例中DefaultExt,还指定了不带..

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

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

于 2020-09-25T18:31:16.780 回答
1

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

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

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

Microsoft.Win32.FileDialog.DefaultExt(MSDN):

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

于 2019-12-10T18:18:21.213 回答