2011-03-30 4 views
2
WPF에서

다음 코드는 주어진 위치에있는 모든 글꼴의 목록을 반환 : 당신이 폴더 (글꼴을 추가 또는 제거)의 내용을 변경하고이 코드를 실행 경우WPF Fonts.GetFontFamilies()는 글꼴 목록을 캐시하고 캐시를 지우는 방법을 설명합니다.

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

문제는 다시, 동일한 목록을 반환합니다 (캐시 된 내부적으로).

응용 프로그램을 종료 할 때까지이 캐시는 삭제되지 않습니다!

이 동작을 방지하고 항상 그 순간 글꼴의 해당 폴더를 조사하도록 WPF를 만들 수있는 방법이 있습니까?

참고 : 결과에 관계없이 "윈도우 프리젠 테이션 파운데이션 글꼴 캐시 3.0.0.0" 서비스 상태를 시작하거나 정지의 동일합니다. 분명히이 특정 유형의 캐시는 서비스에서 처리되지 않습니다.

+0

디버그 및 릴리스 구성 모두에서 응용 프로그램을 실행할 때 이런 현상이 발생합니까? 디버그 모드에서만 발생하는 유사한 문제가있었습니다. –

+0

예, 릴리스/디버그/내 VS/독립 실행 형 응용 프로그램을 실행해도 상관 없습니다. 항상 캐싱이 있습니다. –

답변

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 folder"에 대해서만 책임이 있으며 Fonts.GetFontFamilies()는 다른 캐싱 시스템을 사용합니다. –

+0

@shayan - 관련 글꼴 패밀리를 수동으로 가져 오기위한 샘플을 포함하도록 답변을 업데이트했습니다. 귀하의 경우에는 작동하지 않을 수도 있습니다. – CodeNaked

+0

좋은 해결 방법입니다! –

관련 문제