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

Avalonia开发疑问:如何使用当前系统默认字体?

解决Avalonia在Ubuntu下默认字体不匹配系统的问题

Avalonia的$Default字体是通用占位符,在Linux环境下无法自动精准匹配系统默认字体,需要手动配置关联。以下是具体解决步骤:

1. 获取Ubuntu系统默认字体名称

打开终端执行命令:

gsettings get org.gnome.desktop.interface font-name

输出示例:'Ubuntu 11',提取其中的字体名称部分(这里是Ubuntu)。

2. 全局设置默认字体

方法一:通过XAML全局配置

打开项目中的App.axaml(或App.xaml),在<Application.Styles>节点内添加全局样式,覆盖所有控件的字体:

<Style Selector="Control">
    <Setter Property="FontFamily" Value="Ubuntu" />
</Style>

如果需要针对特定控件精细化设置,也可以单独定义:

<Style Selector="TextBlock">
    <Setter Property="FontFamily" Value="Ubuntu" />
</Style>
<Style Selector="Button">
    <Setter Property="FontFamily" Value="Ubuntu" />
</Style>

方法二:通过代码动态获取并设置

在App.xaml.cs的OnFrameworkInitializationCompleted方法中添加逻辑,自动读取系统字体并全局设置:

protected override void OnFrameworkInitializationCompleted()
{
    if (OperatingSystem.IsLinux())
    {
        var systemFontName = GetSystemDefaultFontName();
        Avalonia.Media.FontManager.Current.DefaultFontFamily = new Avalonia.Media.FontFamily(systemFontName);
    }

    base.OnFrameworkInitializationCompleted();
}

private static string GetSystemDefaultFontName()
{
    using var process = new System.Diagnostics.Process();
    process.StartInfo.FileName = "gsettings";
    process.StartInfo.Arguments = "get org.gnome.desktop.interface font-name";
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.UseShellExecute = false;
    process.Start();
    
    var output = process.StandardOutput.ReadToEnd().Trim();
    process.WaitForExit();
    
    // 解析输出格式,提取字体名称
    return output.Split(' ')[0].Trim('\'');
}

3. 验证配置效果

在代码中添加输出语句,确认默认字体已生效:

Console.WriteLine(Avalonia.Media.FontManager.Current.DefaultFontFamily.Name);

此时输出应该是你设置的系统字体名称(比如Ubuntu),而非$Default。

注:如果是其他Linux发行版,只需替换获取系统字体的命令即可(例如KDE环境使用kwriteconfig5相关命令)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:37:49