15

我有一个应用程序对资源使用单独的库程序集(但不是没有代码的仅资源程序集),我想在库中包含自定义字体。

Open Type Font如果我将其 .otf 文件作为资源添加到正在执行的程序集的项目(而不是资源库项目)中,我可以加载字体,即.otf 文件,并将属性设置为 Build Action = 'Resource ' 和 Copy to Output = 'Do Not Copy',使用以下代码:

FontFamily font = new FontFamily(new Uri("pack://application:,,,/"), 
                      "./Resources/#CustomFont")); // Resources is a subfolder

但是,当我尝试将字体添加到资源库项目时,字体不会加载。我尝试使用以下代码来加载它(另请注意:我对包 URI 没有太多经验):

FontFamily font = new FontFamily(new Uri("pack://application:,,,/MyLibrary"),
                      "./Resources/#CustomFont")); 
                      // there is a Resources subfolder in my library as well
                      // not sure about whether I need the .

该库确实适用于其他资源,例如图像。

我还尝试了 URI 的一系列其他排列但没有成功(它也不会抛出异常,只是使用默认字体显示,不确定这是否是一个单独的问题)。

我一直在 MSDN 上使用 Packaging Fonts with Applications工作,它有一个创建字体资源库的示例,但没有使用代码背后的示例(我被迫为此使用代码)。

关于我需要做什么的任何想法?我偏离轨道了吗?

4

4 回答 4

21

我让它在我的应用程序中工作(在代码隐藏中从另一个程序集中加载字体)。对于这样的字体 URI:

pack://application:,,,/MyAssembly.Name;component/Resources/Fonts/#Swis721 Md BT

我让它工作的方式(经过痛苦的反复试验,如果我没记错的话)是:

new FontFamily(
    new Uri("pack://application:,,,/MyAssembly.Name;component/Resources/Fonts/"),
    "./#Swis721 Md BT"
)

希望有帮助。

于 2012-05-09T20:19:09.640 回答
1

WPF 不支持使用包表示法以编程方式创建 FontFamily 对象。

文档在页面末尾说,here

这是报价:

使用 pack: 表示法的绝对 URI: WPF 应用程序不允许您以编程方式使用“pack:”作为对字体的绝对统一资源标识符 (URI) 引用的一部分来创建 FontFamily 对象。例如,“pack://application:,,,/resources/#Pericles Light”是一个无效的字体引用。

于 2015-03-30T13:45:01.873 回答
0

(我知道,老问题,但我没有找到正确的答案。)

罗斯的答案仅适用于某些版本的网络框架。(不适用于网络 4.6)

我认为这是最好的答案:

枚举应用程序中的字体:

 foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/"))
            {
                // Perform action.
            }

参考

于 2017-02-11T21:48:16.223 回答
0

为了从代码中引用字体资源项,您必须提供由两部分组成的字体资源引用:基本统一资源标识符 (URI);和字体位置参考。这些值用作 FontFamily 方法的参数。下面的代码示例显示了如何在名为 resources 的项目子目录中引用应用程序的字体资源。

// The font resource reference includes the base URI reference (application directory level),
// and a relative URI reference.

myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/"), "./resources/#Pericles Light");

基本统一资源标识符 (URI) 可以包括字体资源所在的应用程序子目录。在这种情况下,字体位置引用不需要指定目录,但必须包含前导“./”,这表示字体资源位于由基本统一资源标识符 (URI) 指定的同一目录中。下面的代码示例显示了引用字体资源项的​​另一种方法——它等同于前面的代码示例。

// The base URI reference can include an application subdirectory.

myTextBlock.FontFamily = new FontFamily(new Uri("pack://application:,,,/resources/"), "./#Pericles Light");

来源:docs.microsoft.com

于 2020-10-02T07:12:43.983 回答