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

C# XAML Combobox加载自定义字体去除./#前缀问题咨询

问题根源

WPF 中嵌入程序集的自定义字体,其 FontFamily.Source 属性会默认携带资源定位路径,格式为 [资源路径]#字体正式名称,你当前的 ComboBox 直接绑定了 Source 做显示,因此会出现 ./# 前缀。

解决方案

方案1:修改 ComboBox 模板(无侵入,无需修改现有逻辑)

直接给 ComboBox 配置 ItemTemplate,绑定 FontFamily.FamilyNames 集合取字体的正式名称,同时可以让列表项同步应用对应字体效果,XAML 代码如下:

<ComboBox x:Name="_cmbFontFamilies">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock 
                Text="{Binding FamilyNames[zh-CN], FallbackValue={Binding FamilyNames[en-US], FallbackValue={Binding Source.Split('#').Last()}}}"
                FontFamily="{Binding}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

该方案优先级:优先取简体中文名称,其次取英文名称,兜底取 Source 拆分后的字体名,适配绝大多数场景。


方案2:后台处理数据源(可控性更高,排序更符合预期)

如果需要保持后台逻辑的一致性,或者需要自定义排序规则,可以在绑定数据源时做一层转换,代码如下:

using System.Windows.Markup; // 需要引入该命名空间

// 原有赋值逻辑替换为以下代码
if( _cmbFontFamilies != null )
{
    _cmbFontFamilies.ItemsSource = FontUtilities.Families
        .Select(font => new 
        {
            DisplayName = font.FamilyNames.TryGetValue(XmlLanguage.GetLanguage("zh-CN"), out string zhName) 
                ? zhName 
                : font.FamilyNames.TryGetValue(XmlLanguage.GetLanguage("en-US"), out string enName) 
                    ? enName 
                    : font.Source.Split('#').Last(),
            FontInstance = font
        })
        .OrderBy(item => item.DisplayName)
        .ToList();
    // 配置显示和取值字段
    _cmbFontFamilies.DisplayMemberPath = "DisplayName";
    _cmbFontFamilies.SelectedValuePath = "FontInstance";
}

该方案会按字体正式名称排序,避免了自定义字体因 Source 带前缀导致排序位置异常的问题。

内容的提问来源于stack exchange,提问作者Roberto Vargas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 08:54:02