为我的应用程序使用字体时,如果找不到我在样式中设置的 FontFamily,我不会收到任何警告/错误/异常。

通常在 WPF 中,您会在输出窗口中收到一条警告消息,告诉您绑定(bind)不存在。或者,当您的 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'}"/>

最佳答案

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

例如

<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 )。

您可以从服务提供商处获取更多信息,例如关于 FontFamily 设置和输出的对象类型,以帮助调试。

关于c# - 调试已加载的 FontFamily?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8312684/

10-12 23:59