2011-03-30 108 views
2

在WPF中,下面的代碼返回給定位置的所有字體的列表:WPF Fonts.GetFontFamilies()緩存字體列表,如何清除緩存?

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

的問題是,如果你更改該文件夾(添加或刪除字體)的內容和運行此代碼再次,它返回相同的列表(因爲它是緩存內部某處)。

這個緩存不會被清除,直到你的退出該應用程序!

有什麼辦法可以防止這種行爲,並且總是讓WPF在那個時候查看那個文件夾的字體嗎?

注:結果是無論「的Windows Presentation Foundation字體緩存3.0.0.0」服務狀態啓動或停止的一樣。顯然,這種特定類型的緩存並未被服務處理。

+0

當您在Debug和Release配置中運行應用程序時,會發生這種情況嗎?我有一個類似的問題,只發生在調試模式下。 – 2011-03-30 15:09:43

+0

是的,它是一樣的,不管我在Release/Debug/VS/Standalone內運行應用程序。總是緩存在那裏。 – 2011-03-30 15:14:33

回答

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); 
    } 
} 

可能有一些問題,與家人的名字,但上面的應該讓你大部分的相關信息。

+1

恐怕即使有殘疾人服務,結果也是一樣的。 顯然,該服務只負責「字體文件夾」和「Fonts.GetFontFamilies()」使用另一個緩存系統。 – 2011-03-31 09:17:07

+0

@shayan - 我已經更新了我的答案,以包含手動獲取相關字體系列的示例,這可能適用於您的情況,也可能不適用。 – CodeNaked 2011-04-03 00:07:51

+0

這是一個很好的解決方法! – 2011-04-04 13:46:01