在WPF中,以下代码返回给定位置中所有字体的列表:
foreach (var fontFamily in Fonts.GetFontFamilies(@"C:\Dummy\Fonts\"))
{
System.Diagnostics.Debug.WriteLine(fontFamily.Source);
}
问题是,如果您更改该文件夹的内容(添加或删除字体)并再次运行此代码,则会返回相同的列表(因为它缓存某处内部。)
在退出应用程序之前,不会清除此缓存!
有没有办法阻止这种行为,并且总是让WPF在那一刻查看该文件夹中的字体?
注意:无论“Windows Presentation Foundation字体缓存3.0.0.0”服务状态是否已启动或停止,结果都是相同的。显然,服务不会处理这种特定类型的缓存。
答案 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);
}
}
姓氏可能存在一些问题,但上述内容应该可以为您提供大部分相关信息。