2011-11-29 47 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); 
     } 
    } 

这将显示是否加载字体像这样将工作:(从而检查工作路径)

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

请添加您的款式xaml。 –

回答

1

可能使用markup extension,不幸的是,这将需要您在设置FontFamily的每个地方使用它。

例如在调试运行时(这应当满足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;组件/#Segoe UI”,它将显示该字符串,但它不会告诉我如果加载成功,并且当前字体是什么,那么Snoop不是答案? – Kolky