WPF自定义字体问题

6

这真的很奇怪。在 Blend 4 中,当我在设计师中查看应用程序时,自定义字体是有效的,但当我运行它时,字体就消失了,变成了 Arial 或其他字体。这是我的 XAML 代码:

<TextBlock Text="Text G" FontFamily="/ProjectName;component/Fonts/#Futura Lt BT" FontSize="48" Background="#FFC44747" />

字体在一个名为“Fonts”的文件夹中,而我正在尝试使用该字体的控件位于一个名为“Controls”的文件夹中。我知道这可能是由于“Fonts”文件夹与“Controls”文件夹的相对位置问题引起的,但我已经尝试了很多方法,但没有成功。
此外,我放在上面的XAML标记就是当我选择自定义字体时Blend创建的。字体作为资源被复制得很好(我已经检查了csprof文件并且它在那里)。
有任何想法吗?这个问题困扰我已经几个小时了。
谢谢。

有一天我编译了(没有更改),你的源代码控制(SCC)里面显示了什么差异? - Mitch Wheat
@Mitch Wheat 没有任何改变,显然这是 WPF 中的一个错误。 - Carlo
3
我不明白为什么会有人对此进行负评,因为这是我真正(且非常恼人)遇到的问题。有时候stackoverflow社区可能会非常讨厌。 - Carlo
我不会点踩,因为我完全明白你的意思。我也曾经遇到过这种情况,虽然一定有什么东西发生了变化,但肯定不是我能控制的。编译几次后,一切都恢复正常了。也许尝试获取项目的最新版本? - Kent Boogaart
点赞了,为了试着平衡一下 :) - Mitch Wheat
@Kent Boogaart,这真的很令人沮丧。希望我找到的解决方案能够一劳永逸地解决它。 - Carlo
2个回答

3

虽然我知道现在帮不了提问者了,但我留下这个来帮助未来查看此问题的人。

以下信息来自于MSDN上的使用应用程序打包字体页面:

将字体添加为内容项

您可以将字体作为项目内容项添加到应用程序中,这些内容项与应用程序的程序集文件分开。这意味着内容项不会作为资源嵌入到程序集中。以下项目文件示例显示如何定义内容项。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Other project build settings ... -->

  <ItemGroup>
    <Content Include="Peric.ttf" />
    <Content Include="Pericl.ttf" />
  </ItemGroup>
</Project>

为了确保应用程序能够在运行时使用字体,这些字体必须在应用程序的部署目录中可访问。应用程序项目文件中的 <ItemGroup> 元素允许您在构建过程中自动将字体复制到应用程序部署目录中。以下项目文件示例显示如何将字体复制到部署目录中。
<ItemGroup>
  <Content Include="Peric.ttf">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
  <Content Include="Pericl.ttf">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>

将字体添加为资源项

您可以将字体作为项目资源项添加到应用程序中,这些资源项嵌入在应用程序的程序集文件中。使用单独的子目录来存储资源有助于组织应用程序的项目文件。以下项目文件示例显示如何在单独的子目录中定义字体作为资源项。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- Other project build settings ... -->

  <ItemGroup>
    <Resource Include="resources\Peric.ttf" />
    <Resource Include="resources\Pericl.ttf" />
  </ItemGroup>
</Project>

当您将字体添加为应用程序资源时,请确保在应用程序的项目文件中设置<Resource>元素,而不是<Content>元素。构建操作的<Content>元素不受支持。
以下标记示例显示如何引用应用程序的字体资源。
<TextBlock FontFamily="./resources/#Pericles Light">
  Aegean Sea
</TextBlock>

请点击上面的链接了解有关从代码引用字体资源和其他有用信息的详细信息。

0

在互联网和书籍中,无论何时添加字体,都应将构建操作设置为“资源”(例如此处)。这个方法“一度奏效”。但是,为了解决我的问题,我不得不将其从“资源”更改为“内容”。


将字体设置为“Content”(可能使用“始终复制”),可以将该字体放置在系统中,用户可以对其进行操作。虽然不太可能,但将其用作资源是更好的惯例。 - Michael Repucci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接