Wpf 嵌入式字体适用于设计器,但不适用于应用程序

Wpf 嵌入式字体适用于设计器,但不适用于应用程序,wpf,fonts,Wpf,Fonts,我正在构建一个wpf应用程序,我想在我的应用程序中使用OpenSANS常规字体 我参考了嵌入字体的链接。我将OpenSans Regular.ttf文件添加到项目属性下的资源中 然后我在我的申请中提到了他们,如下所述: <Window x:Class="FontEmbeddingDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

我正在构建一个wpf应用程序,我想在我的应用程序中使用OpenSANS常规字体

我参考了嵌入字体的链接。我将OpenSans Regular.ttf文件添加到项目属性下的资源中

然后我在我的申请中提到了他们,如下所述:

<Window x:Class="FontEmbeddingDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" FontFamily="Resources/#Open Sans">
<Window.Resources>
    
</Window.Resources>
<Grid>
    <TextBlock Height="100" Text="This is test text." FontSize="14" FontFamily="Resources/#Open Sans"/>
</Grid>
</Window>

在VisualStudio的designer中,我可以看到字体更改为open SAN,但当我运行应用程序时,它采用系统默认字体(我的系统中为Arial)

如果您需要任何其他信息,请务必告诉我。

第页:

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

因此,我想,您必须将此字体文件添加到项目中,就像添加任何其他文件一样,并将其
BuildAction
设置为
Resource
,而不是将字体添加到项目属性下的资源中,这将使其成为嵌入式资源

编辑

阅读关于如何在WPF应用程序中使用自定义字体的优秀文章


您还可以通过@Sheridan提到的方法来实现这一点,即将
BuildAction
设置为
Content
。然而,这种方法的问题是,您将有松散的单独文件与二进制文件一起挂起。用户可能会更改此文件,这可能会导致应用程序出现问题。最好使用
Resource
作为
BuildAction
,因为字体被捆绑到程序集中。

在我看来,我认为这个问题的公认答案可能是错误的,或者是误导性的。我以完全相同的方式使用
Font
文件,完全不需要将它们的
BuildAction
设置为
Resource
。我的
Font
文件将
BuldAction
设置为
Content
,效果很好。我猜想,接受的答案只会帮助那些将
Font
文件设置为
EmbeddedResource
的用户

@sthotakura在链接的MSDN页面上引用的评论仅仅是指手动编辑项目文件,而问题作者并没有这样做。请注意,链接页面中没有提到
BuildAction
属性,只提到
EmbeddedResource
值在这种情况下无效

请改为或同时尝试以下操作:

Font
文件的
BuildAction
设置为
Content
。 像这样引用
Font
文件(使用所有重要的起始斜杠):


我刚刚试着在我的项目中删除起始斜杠,
Font
默认为另一个
Font
,所以我很确定这会起作用。。。尽管如此,请让我知道。如果我错了,我非常乐意删除这个答案。

我认为,您必须将字体文件添加到项目中,并将其
BuildAction
设置为Resource。它作为资源添加到项目中。我认为资源没有被编译。它们是按原样使用的。@sthotakura:我也可以在设计器中看到应用效果,但是当我在应用程序窗口中构建项目并运行应用程序时,我看不到应用为打开的字体sans@sthotakura:但你是对的,我将构建操作更改为资源。成功了。非常感谢:)请将其作为答案发布,以便我可以标记它。我知道OP的资源构建操作是EmbeddedResource,因为OP提到OP添加到项目属性下的资源中。我建议他改成it
Resource
。我知道OP可以通过将
BuildAction
设置为
Content
来实现,但我不建议这样做,因为它可能会留下字体文件供用户篡改。如果您阅读MSDN页面,它将讨论添加自定义字体的所有可能方法。因此,我的回答既没有错误也没有误导。@sthotakura,虽然我承认你帮助用户解决了他们的问题,但我只是担心其他正在寻找解决方案的用户可能没有将他们的
Font
文件
BuildAction
设置为
EmbeddedResource
,因此你的回答可能对他们没有帮助。。。我的观点是,您的解决方案只会帮助那些将文件
BuildAction
设置为
EmbeddedResource
的用户。我一直在寻找一个更具全球性的解决方案,可以帮助任何人,但我的回答并不意味着什么。。。希望你能理解这一点。如果问题作者回来确认或否认这个解决方案是有效的,这样将来的用户也能获得这些信息,那就好了,但这并不重要。。。他们可以阅读这个答案,如果你的答案没有帮助的话,他们可以自己尝试。还有@sthotakura,我编辑了我答案的开头,让它听起来不那么粗鲁。。。我不是故意的。。。我想我只是天生粗鲁。编辑了我的答案,并包含了一篇博客文章的链接,详细讨论了这个问题(添加自定义字体)。谢谢:)@Sheridan:我遇到了这个字体问题,我选择了msdn路线。并尝试将字体作为嵌入式资源。所以我相信答案是根据msdn的,因为我也提到了它的参考资料。但这次讨论确实让我找到了全球解决方案。使它们成为资源会将它们限制在解决方案中的一个项目中。对不起,行动晚了。我当时正在开车对链接文章的一个小注释是:如果您想使用其他项目中的字体,那么您可能需要将程序集名称添加到字体位置字符串:'pack://application:,,,/assemblyName;Resources/#opensans'但是我的字体文件的
BuildAction
设置为
Resource
(它仍然不工作)。。。
FontFamily="/Resources/#Open Sans"