【问题标题】:Fonts names in the Combobox List XAML c#组合框列表中的字体名称 XAML c#
【发布时间】:2025-11-28 06:40:01
【问题描述】:

我正在设计一个字体列表,我在其中引用 Fonts.SystemFontFamilies,但我还想包含 3 种存在于我的 MyDllProject 项目中的自定义字体。首先我添加了 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;
       }   
      }
    }    
  }

我得到的结果。

【问题讨论】:

  • 您能与 ComboboxList 共享 xaml 代码吗?
  • 抱歉,已编辑,现在代码更清晰了
  • 您需要只显示字体名称还是在您的应用程序中将选定的字体系列用于其他用途?
  • 是的,改变字体家族的功能是一样的。所以,改名字是不够的,Source 必须在 SelectedValuePath 中,Name 必须在 DisplayValuePath 中,但是我不知道怎么做。

标签: c# xaml fonts font-family


【解决方案1】:

Fonts.GetFontFamilies 返回的每个结果 FontFamily 对象都有一个格式为 "./#Family Name" 的友好名称。此友好名称设置了FontFamilySource 属性,Source 属性的值由FontFamily.ToString() 方法返回。

我会创建一个自定义类FontName

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

    public string Source { get; set; }
}

并通过FontUtilities.Families 返回FontName 的集合。加载自定义字体时删除前缀"./#"

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

}

【讨论】:

  • 是的,改变字体家族的功能是一样的。所以,改名字是不够的,Source 必须在 SelectedValuePath 中,Name 必须在 DisplayValuePath 中,但是我不知道怎么做。
  • font.FamilyNames.Values.ElementAt(0).ToString();返回带有字体名称的字符串,不包含 ./# 字符
  • @RobertoVargas 检查更新的答案。我已将属性 Source 添加到 FontName 类并设置 SelectedValuePath 和 DisplayValuePath。
  • 不起作用,我必须在 ApplyPropertyValueToSelectedText( TextElement.FontFamilyProperty, (FontFamily)font); 中使用该字体,并且 FontName 不是 FontFamily。 DisplayValuePath 也不起作用,它应该起作用但它不是。