调试加载的FontFamily?

时间:2011-11-29 14:44:39

标签: c# wpf fonts

在我的应用程序中使用字体时,如果找不到我在样式中设置的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'}"/>

2 个答案:

答案 0 :(得分:2)

可以使用markup extension,遗憾的是,您需要在设置FontFamily的每个地方使用它。

e.g。

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

在调试中运行时,警告将显示在输出窗口中(应满足conditional)。

Output window

您可以从服务提供商那里获得更多信息,例如设置FontFamily的对象是什么类型,并输出以帮助调试。

答案 1 :(得分:0)

尝试使用Snoop。启动WPF应用程序。让Snoop附加到您的WPF应用程序。然后,您可以选择控件以查看加载的字体。