You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在WPF应用中为Google Font显示友好名称?

解决WPF中自定义字体在ComboBox显示友好名称的问题

我来帮你搞定这个问题,核心是正确配置自定义FontFamily的FamilyNames属性,同时确保ComboBox能读取到这个友好名称,而非默认的资源URI。

第一步:修正App.xaml中FontFamily资源的定义

你之前的写法出现语法错误,是因为没有把资源URI放到<FontFamily.Source>标签里。正确的定义需要明确指定Source,同时配置FamilyNames(记得先引入system命名空间):

首先在App.xaml的根标签添加system命名空间:

xmlns:system="clr-namespace:System;assembly=mscorlib"

然后修改Montserrat字体的资源定义:

<FontFamily x:Key="Montserrat">
    <!-- 指定字体的资源路径 -->
    <FontFamily.Source>pack://application:,,,/Themes/General/Fonts/#Montserrat</FontFamily.Source>
    <!-- 配置多语言友好名称,这里以英文和中文为例 -->
    <FontFamily.FamilyNames>
        <system:String x:Key="en-US">Montserrat</system:String>
        <system:String x:Key="zh-CN">Montserrat</system:String>
    </FontFamily.FamilyNames>
</FontFamily>

第二步:让ComboBox正确显示友好名称

默认情况下,自定义字体的ToString()方法会返回完整资源URI,所以我们需要修改ComboBox的ItemTemplate,直接绑定到FamilyNames中的友好名称,还能顺便预览字体样式:

<ComboBox x:Name="PART_editor" 
          Tag="{Binding}"
          SelectedValue="{Binding Value}" 
          IsEnabled="{Binding IsEditable}"
          ItemsSource="{Binding Source={x:Static t:MyFonts.MyFontFamilies}, Converter={StaticResource SystemFontFamiliesConverter}}"
          VerticalAlignment="Stretch">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <!-- 绑定当前语言对应的友好名称,同时用该字体显示 -->
            <TextBlock Text="{Binding FamilyNames[{x:Static xml:XmlLanguage.GetLanguage('en-US')}]}" 
                       FontFamily="{Binding}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

注意需要引入xml命名空间:xmlns:xml="http://schemas.microsoft.com/winfx/2006/xaml",这样可以动态匹配当前系统语言;如果不需要多语言适配,直接写固定的语言键值也可以。

兜底方案:代码中手动设置FamilyNames

如果XAML配置后仍有问题,可以在添加字体时手动补充FamilyNames:

public static class MyFonts
{
    private static Collection<FontFamily> myFontFamilies = null;
    public static Collection<FontFamily> MyFontFamilies
    {
        get
        {
            if (myFontFamilies == null)
            {
                myFontFamilies = new(Fonts.SystemFontFamilies.ToList());
                var montserratFont = Application.Current.FindResource("Montserrat") as FontFamily;
                if (montserratFont != null)
                {
                    var enUsLang = XmlLanguage.GetLanguage("en-US");
                    // 如果未设置英文名称,就添加
                    if (!montserratFont.FamilyNames.ContainsKey(enUsLang))
                    {
                        montserratFont.FamilyNames.Add(enUsLang, "Montserrat");
                    }
                    myFontFamilies.Add(montserratFont);
                }
            }

            return myFontFamilies;
        }
    }
}

原理说明

系统字体的FontFamily对象已经内置了FamilyNames属性,所以ComboBox默认显示友好名称;而自定义字体如果不手动设置FamilyNames,WPF会用资源URI作为默认显示文本。通过上面的配置,我们给自定义字体添加了明确的友好名称,再让ComboBox直接读取这个名称,就能解决显示冗长URI的问题。

内容的提问来源于stack exchange,提问作者Sean Beanland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 18:15:37