Windows窗体应用程序的默认字体

was*_*ker 36 .net user-interface fonts appearance winforms

每次我在我的应用程序中创建一个新表单时,它默认使用"Microsoft Sans Serif,8.25pt"字体.我没有改变它,因为我知道在这种情况下我的表单应该选择系统的默认字体.但是,当我运行我的应用程序时,使用的字体仍然是Segoe UI(我的Windows Vista操作系统中的默认系统字体).

为什么会这样?如何确保我的应用程序看起来像普通的Windows应用程序?

Cod*_*ray 44

接受的答案并没有真正回答这个问题; 它只是解释了为什么会出现这种情况.

其他一些答案提出了可靠的解决方法,但我发现最好的解决方案是创建一个基本表单,应用程序中的所有表单都从该表单继承并SystemFonts.MessageBoxFont在构造函数中将此基本表单的Font属性设置为.这不仅可以确保您的应用程序在运行时根据用户的环境选择正确的字体(退出Hans Passant提出的潜在问题 - 没有Office 2007的XP将在没有Segoe UI的情况下使用Microsoft Sans Serif ),但也为您当前的Windows字体提供设计时支持.在设计时使用正确的字体解决了Josuegomes指出的问题,因为在表单上创建的任何容器控件将在设计时获取表单使用的字体.

除了上述优点之外,这还使您不必记住修改您创建的每个表单的构造函数,并确保应用程序中所有表单的一致性,以及为您提供放置其他常用功能的位置.我以几种不同的方式使用它,如p/invoking等,以修复WinForms实现中的错误.

这种方法的唯一问题是,如果要为特定控件设置字体样式,例如粗体.执行此操作的最佳位置仍然是该窗体的构造函数,从窗体的字体作为基础开始并从中修改样式:

myControl.Font = New Font(Me.Font, FontStyle.Bold)
Run Code Online (Sandbox Code Playgroud)


CS.*_*CS. 31

您可以在Form构造函数中的InitializeComponent()之前添加:

this.Font = SystemFonts.MessageBoxFont;
Run Code Online (Sandbox Code Playgroud)

这似乎适用于Windows XP和Windows Vista.


Rob*_*ner 13

查看此博客文章,谈论Forms中的默认字体,这会导致您遇到的问题以及此Connect Bug与Microsoft的响应.简而言之,似乎Forms没有获得(正确的)默认窗口字体(您已更改).


Han*_*ant 11

是的,它使用返回的字体GetStockObject(DEFAULT_GUI_FONT).这是MS Sans Serif.一种旧字体,早已从大多数机器中消失.字体映射器将它翻译成微软Sans Serif,毫不奇怪.

我知道没有文档化的程序来更改默认字体,SDK文档明确提到MS Sans Serif.如果你想要Segoe,你必须要求它.哪个不安全,在没有Office 2007的情况下仍然有很多XP机器.字体映射器将在没有Segoe可用的机器上翻译它.不确定是什么弹出来的,我再也没有这样的机器了.


小智 7

在 .NET Core 中,我们(.NET 团队)将默认字体更新为 Segoe UI,在 .NET 6 中,我们添加了一个 API 来更改整个应用程序的默认字体。

在项目文件里面<PropertyGroup>添加:

<ApplicationDefaultFont>Curlz MT, 18pt</ApplicationDefaultFont>
Run Code Online (Sandbox Code Playgroud)

这将更新设计器和正在运行的应用程序中使用默认字体(您未明确覆盖的所有内容)的每个控件。

您也可以Application.SetDefaultFont()直接调用,Main()如下例所示:

static void Main()
{
    ApplicationConfiguration.Initialize();

    Application.SetDefaultFont(new Font(new FontFamily("Curlz MT"), 18f));

    Application.Run(new AirQualityForm());
}
Run Code Online (Sandbox Code Playgroud)

这将更新正在运行的应用程序中的字体,但不会更新设计器中的字体。