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

4
在WPF中,以下代码将返回给定位置所有字体的列表:
foreach (var fontFamily in Fonts.GetFontFamilies(@"C:\Dummy\Fonts\"))
{
    System.Diagnostics.Debug.WriteLine(fontFamily.Source);
}

问题在于,如果你更改该文件夹的内容(添加或删除字体),然后再次运行此代码,则返回相同的列表(因为它在内部某处被缓存)。
此缓存将不会清除,直到你退出应用程序!
有没有办法防止这种行为,并始终使 WPF 在那个时刻查找该文件夹中的字体呢?
注意:无论“Windows Presentation Foundation Font Cache 3.0.0.0”服务状态是启动还是停止,结果都是相同的。显然,该特定类型的缓存未被该服务处理。

当您在Debug和Release配置下运行应用程序时,是否会出现这种情况?我曾经遇到过类似的问题,只有在Debug模式下才会出现。 - Mike Dinescu
是的,无论我在发布/调试/Visual Studio内运行应用程序还是独立运行,都是一样的。始终存在缓存。 - el_shayan
1个回答

2
我认为您可能需要禁用字体缓存服务,因为它可能会在需要时自动启动。
编辑:
您可能需要像这样自己获取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);
    }
}

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

1
我很抱歉,即使禁用了服务,结果仍然是一样的。 显然,该服务只负责“字体文件夹”,而Fonts.GetFontFamilies()使用另一个缓存系统。 - el_shayan
@shayan - 我已更新我的答案,包括手动获取相关字体系列的示例,这在您的情况下可能有效,也可能无效。 - CodeNaked

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接