组合框列表中的字体名称 XAML c#

Fonts names in the Combobox List XAML c#

我正在设计一个字体列表,我在其中引用了 Fonts.SystemFontFamilies,但我还想包括我的 MyDllProject 项目中存在的 3 种自定义字体。首先我添加了 SystemFontFamilies,效果很好,然后我添加了我的自定义字体(Roboto、Abstractus 和 OpenSans),这些字体很好地添加到列表中,但它给了我前缀 ./#.所以,我想找到一种方法来显示字体的名称,就像 Abstractus、Roboto 和 Open Sans 一样。

comboBox的代码是

if( _cmbFontFamilies != null )
      {
            _cmbFontFamilies.ItemsSource = FontUtilities.Families.OrderBy( fontFamily => fontFamily.Source );

      }

FontUtilities 的代码是

  internal class FontUtilities
  {
    internal static IEnumerable<FontFamily> Families
    {
      get
      {
      foreach ( FontFamily font in Fonts.SystemFontFamilies)
      {
          yield return font;
      } 
      foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new 
          Uri("pack://application:,,,/MyDllProject ;Component/Resources/")))
       {
          yield return fontFamily;
       }   
      }
    }    
  }

我得到的结果。

每个由 Fonts.GetFontFamilies 编辑的 FontFamily 对象 return 都有一个形式为 "./#Family Name" 的友好名称。此友好名称设置 FontFamilySource 属性 并且 Source 属性 的值是 return 通过 FontFamily.ToString() 方法编辑的。

我会创建一个自定义 class FontName

public class FontName
{
    public string Name { get; set; }

    public string Source { get; set; }
}

和 return FontUtilities.FamiliesFontName 合集。加载自定义字体时删除前缀 "./#"

internal class FontUtilities
{
    internal static IEnumerable<FontName> Families
    {
        get
        {
            foreach ( FontFamily font in Fonts.SystemFontFamilies)
            {
                yield return new FontName { Name = font.Source, Source = font.Source };
            } 
            foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new 
          Uri("pack://application:,,,/MyDllProject ;Component/Resources/")))
            {
              yield return new FontName { Name = fontFamily.Source.Replace("./#", string.Empty), Source = fontFamily.Source };
            }   
        }
    }    
}


if( _cmbFontFamilies != null )
{
    _cmbFontFamilies.SelectedValuePath = "Source";
    _cmbFontFamilies.DisplayValuePath = "Name";
    _cmbFontFamilies.ItemsSource = FontUtilities.Families.OrderBy( fontFamily => fontFamily.Source );

}