WPF Fonts.GetFontFamilies()缓存字体列表,如何清除缓存?

时间:2011-03-30 15:04:16

标签: c# wpf caching fonts

在WPF中,以下代码返回给定位置中所有字体的列表:

foreach (var fontFamily in Fonts.GetFontFamilies(@"C:\Dummy\Fonts\"))
{
    System.Diagnostics.Debug.WriteLine(fontFamily.Source);
}

问题是,如果您更改该文件夹的内容(添加或删除字体)并再次运行此代码,则会返回相同的列表(因为它缓存某处内部。)

退出应用程序之前,不会清除此缓存!

有没有办法阻止这种行为,并且总是让WPF在那一刻查看该文件夹中的字体?

注意:无论“Windows Presentation Foundation字体缓存3.0.0.0”服务状态是否已启动或停止,结果都是相同的。显然,服务不会处理这种特定类型的缓存。

1 个答案:

答案 0 :(得分:2)

我相信您可能需要disable the font cache service,因为它可能会在需要时自动启动。

编辑:

您可能需要自己获取FontFamily对象列表:

private static FontFamily CreateFontFamily(string path) {
    Uri uri;
    if (!Uri.TryCreate(path, UriKind.Absolute, out uri))
        throw new ArgumentException("Must provide a valid location", "path");

    return new FontFamily(uri, string.Empty);
}

public static IEnumerable<FontFamily> GetNonCachedFontFamilies(string location) {
    if (string.IsNullOrEmpty("location"))
        throw new ArgumentException("Must provide a location", "location");

    DirectoryInfo directoryInfo = new DirectoryInfo(location);
    if (directoryInfo.Exists) {
        FileInfo[] fileInfos = directoryInfo.GetFiles("*.?tf");
        foreach (FileInfo fileInfo in fileInfos)
            yield return CreateFontFamily(fileInfo.FullName);
    }
    else {
        FileInfo fileInfo = new FileInfo(location);
        if (fileInfo.Exists)
            yield return CreateFontFamily(location);
    }
}

姓氏可能存在一些问题,但上述内容应该可以为您提供大部分相关信息。