2011-11-29 3 views
2

При использовании шрифтов для моего приложения я не получаю предупреждение/ошибку/исключение, если FontFamily, установленный в стиле, не найден.Отладка FontFamily загружена?

Обычно в WPF в окне вывода выдается предупреждающее сообщение с сообщением о том, что вы являетесь обязательным, не существует. Или вы получаете исключение, когда ваш ResourceDictionary не может быть загружен, потому что его файл не найден. Однако абсолютно не существует никакого предупреждения при попытке загрузить FontFamily без правильного имени или из неисправной сборки, есть ли способ увидеть, какой шрифт действительно загружен/показан, и если он преуспеет?

* EDIT: Я использовал ответ ниже и изменил метод 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.

например.

<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 и выводит его, чтобы облегчить отладку.

+0

Хорошая идея, может сделать отладку возможной! Благодаря! – Kolky

+0

Хм, мне нужно сделать некоторые изменения для вашего метода «TestFont», поскольку он не делает то, что я хочу, но он поставил меня в правильное направление! Обновит мою основную должность, как только найду правильный код ... – Kolky

0

Попробуйте использовать Snoop. Запустите приложение WPF. Попросите Snoop подключиться к вашему приложению WPF. Затем вы можете выбрать свой элемент управления, чтобы увидеть, какой шрифт загружен.

+0

Да, я вижу, что FontFamily установлен на элементе, однако он отображает точно значение, которое я задал! Например, если у меня есть шрифт: «/ SharedResources/Fonts; компонент/# Segoe UI», но измените его на «/ SharedResources/FontZZZZZ; компонент/# Segoe UI», он отобразит эту строку, но он не скажет мне если загрузка выполнена успешно и каков текущий шрифт, так что Snoop - это не ответ? – Kolky

Смежные вопросы