2011-11-29 8 views
2

내 응용 프로그램에 글꼴을 사용할 때 스타일에 설정된 FontFamily를 찾을 수없는 경우 경고/오류/예외가 표시되지 않습니다.FontFamily 디버깅이로드 되었습니까?

일반적으로 WPF에서는 출력 창이 나타나 바인드가 없다는 경고 메시지가 나타납니다. 또는 파일을 찾을 수 없기 때문에 ResourceDictionary를로드 할 수없는 경우 예외가 발생합니다. 그러나 FontFamily를 적절한 이름이나 결함있는 어셈블리없이로드하려고 시도 할 때 전혀 경고가 없습니다. 실제로로드/표시되는 글꼴을 볼 수있는 방법이 있습니까? 나는 아래의 대답을 사용하고 다음에 TestFont 방법을 변경 : (그래서 있는지 확인 :이 같은 글꼴을로드하는 것은 작동하는지

[Conditional("DEBUG")] 
private void CheckFontFamily() 
{ 
    string fontName = FontFamily.Source.Substring(FontFamily.Source.IndexOf('#') + 1); 

    if (!FontFamily.FamilyNames.Any(x => x.Value == fontName)) 
    { 
     bool fontFamilyFound = false; 
     string baseFontName = fontName; 

     while (!fontFamilyFound && fontName.Contains(' ')) 
     { 
      fontName = fontName.Substring(0, fontName.LastIndexOf(' ')); 
      if (FontFamily.FamilyNames.Any(x => x.Value == fontName)) 
      { 
       fontFamilyFound = true; 
       string fontFace = baseFontName.Substring(fontName.Length + 1); 
       if (!FontFamily.FamilyTypefaces.Any(x => x.AdjustedFaceNames.Any(y => y.Value == fontFace))) 
       { 
        Console.WriteLine("WARNING: Font '{0}' with TypeFace '{1}' not found at '{2}'.", fontName, fontFace, FontFamily.Source); 
       } 
       break; 
      } 
     } 

     if (!fontFamilyFound) 
     { 
      Console.WriteLine("WARNING: Font '{0}' not found at '{1}'.", fontName, FontFamily.Source); 
     } 
    } 

이가 표시됩니다 EDIT

*

경로가 작동 됨)

<TextBlock Text="Lorem Ipsum" FontFamily="{Fonts:FontFamily '/Project;component/Fonts/#ITC Quay Book'}"/> 
+0

xaml에 스타일을 추가하십시오. –

답변

1

당신 불행히도 당신이 FontFamily을 설정할 경우 모든 장소에서 사용하도록 요구하는 markup extension 사용할 수 있습니다.

합니다 (conditional을 만족해야하는) 디버그 실행하는 경우

<TextBlock Text="Lorem Ipsum" FontFamily="{me:FontFamily Spam}" /> 
public sealed class FontFamilyExtension:MarkupExtension 
{ 
    public FontFamily FontFamily { get; set; } 

    public FontFamilyExtension(FontFamily fontFamily) 
    { 
     FontFamily = fontFamily; 
    } 

    [Conditional("DEBUG")] 
    private void TestFont() 
    { 
     if (!Fonts.SystemFontFamilies.Contains(FontFamily)) 
      Console.WriteLine("Font '{0}' not found.", FontFamily.Source); 
    } 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     TestFont(); 
     return FontFamily; 
    } 
} 

경고는 다음 출력 창에 표시됩니다.

Output window

당신은 서비스 제공 업체, 예를 들어, 더 많은 정보를 얻을 수 있습니다 디버깅을 돕기 위해 FontFamily가 어떤 종류의 객체를 설정하고 출력했는지 확인합니다.

+0

좋은 생각, 디버깅을 가능하게 만들 수 있습니다! 감사! – Kolky

+0

흠,'TestFont' 메쏘드에 대해 내가 원하는 것을하지 않기 때문에 약간의 변경을해야합니다. 그러나 올바른 방향으로 저를 넣었습니다! 올바른 코드를 찾으면 내 기본 게시물을 업데이트합니다 ... – Kolky

0

Snoop을 사용해보세요. WPF 응용 프로그램을 시작하십시오. Snoop을 WPF 응용 프로그램에 연결하십시오. 그런 다음 컨트롤을 선택하여로드 된 글꼴을 확인할 수 있습니다.

+0

예 요소에 설정된 FontFamily를 볼 수는 있지만 설정 한 값이 정확히 표시됩니다! 예를 들어 "/ SharedResources/Fonts; component/# Segoe UI"에서 글꼴을 사용하지만 "/ SharedResources/FontZZZZZs; component/# Segoe UI"로 변경하면 해당 문자열이 표시되지만 나에게 알려주지 않습니다 로드가 성공하고 현재 글꼴이 무엇인지 알기 때문에 Snoop이 대답이 아닙니까? – Kolky

관련 문제