WPF自定义字体问题

时间:2011-06-29 06:37:12

标签: wpf fonts

这真的很奇怪。在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文件,它就在那里)。

有什么想法吗?这已经把我的屁股踢了几个小时了。

感谢。

2 个答案:

答案 0 :(得分:2)

  

虽然我知道这对提问作者来说已经太晚了,但我将离开这个以帮助未来的观众了解这个问题。

此答案中的信息来自MSDN上的Packaging Fonts with Applications页:

将字体添加为内容项

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

<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>
  <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>

将字体作为资源添加到应用程序时,请确保设置元素,而不是应用程序项目文件中的元素。不支持构建操作的元素。

以下标记示例显示了如何引用应用程序的字体资源。

<TextBlock FontFamily="./resources/#Pericles Light">
  Aegean Sea
</TextBlock>

请按照上述链接获取有关从代码和其他有用信息引用字体资源的详细信息。

答案 1 :(得分:0)

互联网和书籍中的任何地方都说当你添加字体时,你应该将Build Action设置为“Resource”(example here)。它已经工作了一段时间。无论如何,为了解决我的问题,我不得不将其从“资源”更改为“内容”。