【问题标题】:UWP - Font only applied in DesignerUWP - 仅在设计器中应用的字体
【发布时间】:2016-02-17 19:25:08
【问题描述】:

我的主 UWP 应用 (Imp.Dash) 引用了一个类库 (Imp.Dash.Cook)。在所述类库的一个页面中,我有以下 XAML:

<TextBlock Text="Banana" FontFamily="/Imp.Dash;component/Fonts/Portmanteau Regular.ttf#Portmanteau"/>
<TextBlock Text="Banana" FontFamily="/Imp.Dash.Cook;component/Resources/Portmanteau Regular.ttf#Portmanteau"/>
<TextBlock Text="Banana" FontFamily="Resources/Portmanteau Regular.ttf#Portmanteau"/><!-- Works in Designer-->
<TextBlock Text="Banana" FontFamily="Fonts/Portmanteau Regular.ttf#Portmanteau"/>

在尝试更改字体时,只有第三行有任何影响。字体确实发生了变化,但仅限于设计器。在运行时,我什么也得不到。输出中没有错误或类似错误。

有没有人知道我做错了什么,或者我该如何调试它?

字体是一个 .ttf,位于我的类库的 Resources 文件夹中。它设置为ContentDo not copy。后者没有任何影响,即使设置为Copy Always。我也尝试将它放在主项目中,在Fonts 下。

我在图像资源方面遇到了类似的问题,但在这种情况下,它不是嵌入式资源。 (见UWP - Load image in class library

【问题讨论】:

  • 检查输出窗口是否有任何绑定错误/,您可以通过View->Output进行检查
  • 您是否执行了项目清理和重建?
  • 没有输出错误或任何表明有问题的东西。是的,我已经清理、重建、重新启动了。
  • 这是声明式编程的祸根。您的程序中没有可识别的语句可以帮助调试器说“这是错误的!”并提示您对其进行修改。所以没有错误也没有产生异常,没有办法调试它,它只是让字体映射器想出别的东西。是的,这很糟糕。
  • @HansPassant 尽管我很喜欢 XAML,但我同意你的看法。引用任何类型的资源都是 UWP 和 WPF 的痛点。我不确定为什么它在找不到字体时不能抛出异常。只是一些类似于运行时绑定错误的输出很适合我。

标签: c# xaml uwp win-universal-app


【解决方案1】:

在 UWP 应用中,如果我们想使用另一个类库中的某些资产,我们需要使用 ms-appx: 方案,如下所示:

<TextBlock FontFamily="ms-appx:///Imp.Dash.Cook/Fonts/ARCADE_I.TTF#Arcade Interlaced"
           FontSize="40"
           Text="Banana" />

在本例中,.ttf 文件位于Imp.Dash.Cook 类库的Fonts 文件夹中。

如果我们在FontFamily 中使用了错误的 URI,应用程序将无法获取字体文件,如果系统没有安装此字体,应用程序将只使用默认字体。所以我们必须将字体添加到应用程序中。

对于您的情况,我不确定为什么字体仅适用于设计器。但是,我构建了a simple sample in GitHub,自定义字体在设计器和运行时都应用。你可以检查一下。

此外,如果您的类库与您的主 UWP 应用不在同一个解决方案中,您必须检查 Build 配置下的 "Generate library layout" 选项类库的属性页面。

因为在 WinRT 环境下,资源不再嵌入到程序集中,而是作为内容放置在 dll 旁边。所以我们需要生成库布局,以便我们可以方便地引用其他项目中的dll。

【讨论】:

  • 感谢您的详细解释。我下班回家后会试试这个。
  • @jay-zuo-msft:非常感谢您提供的示例。我无法使用我想要的字体,但你的例子引导我让一切正常。显然,UWP 不喜欢该字体中的 something 。我对 OpenType 与 TrueType 的了解还不够,不知道是否可能是这样。
  • #Arcade Interlaced 有什么用?字体文件应该只有 ms-appx:///Imp.Dash.Cook/Fonts/ARCADE_I.TTF 你从哪里得到#name?
  • @Lance 这是存储在 ARCADE_I.ttf 中的字体系列的名称。一个字体文件可以定义多个字体系列,因此,有必要指出您希望使用的字体名称以及文件名。 ms-appx:///Assets/Fonts/FontFilename.ttf#FontFamily
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
  • 2017-06-28
  • 1970-01-01
  • 2021-11-27
相关资源
最近更新 更多