在我的应用程序中使用字体时,如果找不到我在样式中设置的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 :(得分: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)。
您可以从服务提供商那里获得更多信息,例如设置FontFamily的对象是什么类型,并输出以帮助调试。
答案 1 :(得分:0)
尝试使用Snoop。启动WPF应用程序。让Snoop附加到您的WPF应用程序。然后,您可以选择控件以查看加载的字体。