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