WPF Fonts.GetFontFamilies () кэширует список шрифтов, как очистить кеш? - PullRequest
3 голосов
/ 30 марта 2011

В 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» Состояние службы запущено или остановлено.Очевидно, этот конкретный тип кэша не обрабатывается службой.

1 Ответ

2 голосов
/ 30 марта 2011

Полагаю, вам может понадобиться отключить службу кэширования шрифтов , поскольку при необходимости она может запускаться автоматически.

РЕДАКТИРОВАТЬ:

Возможно, вам придется получитьсписок объектов 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);
    }
}

Могут быть некоторые проблемы с фамилией, но приведенное выше должно получить большую часть необходимой информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...