WPF - 按字体名称访问 Roboto 字体时出现问题

Posted

技术标签:

【中文标题】WPF - 按字体名称访问 Roboto 字体时出现问题【英文标题】:WPF - Problem accessing Roboto fonts by font name 【发布时间】:2020-12-27 14:34:14 【问题描述】:

我已经从dafunt.com 下载了 Roboto 字体。 在我的应用程序中,我需要使用三种 Roboto 字体:

Roboto 粗体 机器人培养基 Roboto 常规

但我无法在我的 WPF 应用程序中通过字体名称来识别如何访问正确的字体。 如果我在 Window 的 Character map 应用程序中打开每个字体文件,我可以看到我认为的字体名称。它们是:

File-name             Font name
===============================
Roboto-Bold.ttf       Roboto
Roboto-Medium.ttf     Roboto Lt
Roboto-Regular.ttf    Roboto

注意Robot-BoldRoboto-Regular 具有相同的字体名称

所以我对如何在我的 WPF 应用程序中访问正确的字体感到困惑。

在我的 Visual Studio 项目中,我创建了一个名为 Fonts 的文件夹。这三个字体文件放在那个文件夹中,字体文件包含在我的项目中。 Build Action 设置为每个字体文件的Resource

XAML 代码

<Window x:Class="Main.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:Main"
    xmlns:fa="http://schemas.fontawesome.io/icons/"
    mc:Ignorable="d"
    Loaded="Window_Loaded"
    Title="MainWindow" Height="450" Width="800">

    <Window.Resources>
        <Style x:Key="RobotoBold">
            <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Main;component/Fonts/#Roboto" />
        </Style>
        <Style x:Key="RobotoMedium">
            <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Main;component/Fonts/#Roboto Lt" />
        </Style>
        <Style x:Key="RobotoRegular">
            <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Main;component/Fonts/#Roboto" />
        </Style>

        <Style x:Key="RobotoBoldV2">
            <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Main;component/Fonts/#Roboto Bold" />
        </Style>
        <Style x:Key="RobotoMediumV2">
            <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Main;component/Fonts/#Roboto Medium" />
        </Style>
        <Style x:Key="RobotoRegularV2">
            <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Main;component/Fonts/#Roboto Regular" />
        </Style>
    </Window.Resources>

    <StackPanel Orientation="Vertical">
        <TextBlock Text="asdf1" Style="StaticResource RobotoBold" />
        <TextBlock Text="asdf2" Style="StaticResource RobotoMedium" />
        <TextBlock Text="asdf3" Style="StaticResource RobotoRegular" />
        <Separator Height="6" Visibility="Hidden" />
        <TextBlock Text="asdf4" Style="StaticResource RobotoBoldV2" />
        <TextBlock Text="asdf5" Style="StaticResource RobotoMediumV2" />
        <TextBlock Text="asdf6" Style="StaticResource RobotoRegularV2" />
        <Separator Height="6" Visibility="Hidden" />
        <TextBlock Text="asdf7" />
    </StackPanel>
</Window>

我在设计器中包含了应用程序的图像。

请注意,某些 TextBlock 的字体会有所不同。 这些变化是我无法理解的。

asdf1: 似乎已经被 Roboto 字体改变了。这是 Roboto-Bold 还是 Roboto-Regular 未知。

asdf2:好像没变。

asdf3:自然和asdf1一样。

asdf4:我尝试使用 Roboto Bold,但没有成功。

asdf5:出于某种原因,Roboto Medium 有效。但是没有名称为Roboto Medium的字体文件。

asdf6:我尝试使用Roboto Regular,但没有成功。

asdf7:只是为了比较。好像和asdf2asdf4asdf6的字体一样。

这太令人困惑了。 我确定我使用正确的语法来引用 XAML 代码中的字体文件。但由于字体名称似乎不太可靠,我不确定我的 TextBlocks 中使用了哪些字体。

关于如何清理这个烂摊子有什么建议吗?

【问题讨论】:

在示例图像中,默认字体看起来与 Roboto 非常相似。如果您在某个时候重新运行它,也许使用 Times 或类似的更清晰的东西,只是为了更容易地将它们区分开来?抱歉,虽然我无法回答您的实际问题:( 我认为如果字体名称相同,您可以通过FontWeight属性访问更多选项 【参考方案1】:

我在我的 ASDF1 TextBlock 下方添加了另一个 TextBlock,但字体和文本不同。 我能够看到一些不同。 所以字体确实有效。 谢谢@UuDdLrLrSs。

Roboto-BoldRoboto-Regular 有相同的字体名称还是很奇怪。

【讨论】:

以上是关于WPF - 按字体名称访问 Roboto 字体时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

Firefox 的 Roboto 字体更粗

粗体字的 Roboto 字体不可见

Chrome 中的 Roboto 字体未正确显示

如何在网站上使用 Google 的 Roboto 字体?

如何在 Material UI 的 webpack 构建中包含 Roboto 字体?

如何在 Nuxt/Vuetify 中从头部删除 Google 字体 Roboto?