c# - Visual Studio 设计器不显示嵌入式字体

标签 c# .net wpf fonts

我在我的 C# WPF .NET 4.0 应用程序(特别是 Open Sans 和 FontAwesome)中使用了一些自定义字体和 Visual Studio 2013。

我有:

  1. 在/Fonts 下将 FontAwesome.otf 和 OpenSans-Regular.ttf 添加到我的项目(不是链接)。
  2. 确保两种字体都设置为“Resource”。
  3. 在本地安装了两种字体 (Windows 8.1)。
  4. 在我的资源词典中创建了新样式(其中包含许多其他内容,因此我相信它可以正常工作)。
  5. 重新启动 VS2013。

这是我在资源词典中创建的样式的片段:

<Style x:Key="OpenSans">
    <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Fonts/#Open Sans" />
</Style>

<Style x:Key="FontAwesome">
    <Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Fonts/#FontAwesome" />
</Style>

现在,在我创建的一个新的用户控件中,我纯粹为了测试设计器和正确包含这些字体,我编写了以下 XAML:

    <TextBlock Style="{StaticResource FontAwesome}" FontSize="64" Text="&#xf085;" />
    <TextBlock Style="{StaticResource OpenSans}" FontSize="48" Text="the quick brown fox jumped over the lazy dog." />
    <TextBlock FontFamily="Open Sans" FontSize="48" Text="the quick brown fox jumped over the lazy dog." />

FontAwesome 在设计器中运行,在我的 PC 和另一台未安装 FoneAwesome 的 PC 上运行。

OpenSans 样式不会显示在设计器中,但会在执行时显示,包括在另一台未安装 Open Sans 的 PC 上显示。

Open Sans FontFamily 选择显示在设计器中,但不会显示在另一台未安装 Open Sans 的 PC 上(预期)。

问题

我希望能够使用设计器在设计时查看 UI 在给定我正在使用的提供的字体的情况下的外观。利用我创建的样式,我能够在设计器中看到 FontAwesome 图标,但看不到 Open Sans 字体。我能说出两者之间的唯一区别是 FontAwesome 是一种 Open-Type 字体,而 Open Sans 是一种 True-Type 字体。

如果我忽略了一些简单的事情,或者 VS Designer 中的 OTF 和 TTF 之间是否存在模糊问题,有人知道吗?

最佳答案

发现与解决方案

我无法辨别为什么 Open Sans 没有在 VS Designer 中呈现。我为强制它使用 Open Sans(从附加到项目的字体资源)所做的每一次尝试都会失败,并且设计器会回退到默认字体。

使用与 FontAwesome 相同的方法可以按预期工作,因此 VS 中的字体渲染系统有一些我无法解释的元素。

但是,我想出了一个很好的(也许甚至更好?)解决方案,以及一个我不知道的有关 WPF 字体选择的提示:

WPF 中的 FontFamily 属性支持后备值,例如:

<Style x:Key="OpenSans">
    <Setter Property="TextElement.FontFamily" Value="Open Sans, /<project name>;component/Fonts/#Open Sans" />
</Style>

请注意,此属性的值首先是“Open Sans”,然后是逗号后的项目中包含的字体的 URI。 (提醒一下,您需要确保字体资源在 Build Action Properties 下属于“Resource”类型(在 Solution Explorer 中右键单击字体文件。))

此语法通知 WPF 使用列出的第一个字体,如果不可用,则回退到第二个字体系列,依此类推。

这是(可能)更好的解决方案,因为它会询问系统所需的字体(在本例中为 Open Sans)是否已经可用。如果是,则使用该系统字体,如果不是,它将加载嵌入的字体文件资源。

这提供了一些好处:

  • 此设置使 VS Designer 在我使用它们的地方使用 Open Sans(在本例中)显示字体,因此我可以设计和查看有问题的字体。

  • 此设置还允许首先从系统加载正在使用的字体的机器,如果未找到,则从资源加载。也许是一个次要的注重性能的项目,但仍然有益。

我希望这对使用 Open Sans(或其他字体)的其他人有益,除非直接作为系统字体引用,否则出于某种原因不会出现在 VS Designer 中。

关于c# - Visual Studio 设计器不显示嵌入式字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29615572/

相关文章:

c# - 如何将位掩码值转换为选项对象?

c# - 无法与装饰层上的项目交互

c# - 实现 MS Access 样式 'relationships' GUI

c# - 通过公共(public)属性访问私有(private)变量

c# - 将数据发送到 Windows 窗体应用程序

c# - C#:测试是否在父类(super class)的实例中而不是子类中的一个类

c# - 如何禁用对用于验证消息签名的 x509 证书的验证?

c# - 使用自定义规则进行动态验证

c# - 在 C# 中使用 DirectoryInfo/FileInfo.MoveTo() 将文件或文件夹重命名为小写

c# - 使 ListView.ScrollIntoView 将项目滚动到 ListView 的中心 (C#)