在WPF中,如何在代码中引用资源库中的字体?

时间:2012-05-09 19:17:52

标签: c# wpf fonts pack-uri

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

如果我将其.otf文件作为资源添加到执行程序集的项目(而不是资源库项目),我可以加载字体,即Open Type Font,通过使用以下代码将属性设置为Build Action ='Resource'并复制到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 个答案:

答案 0 :(得分:17)

我在我的应用程序中工作(在代码隐藏中从另一个程序集加载字体)。对于像这样的字体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"
)

希望有所帮助。

答案 1 :(得分:1)

WPF不支持使用包符号以编程方式创建FontFamily对象。

文档在页面末尾here

中说出来

这是引用:

  

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

答案 2 :(得分:0)

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

Ross的答案仅适用于某些版本的netframework。 (不适用于netframework 4.6)

我认为这是最好的答案:

枚举应用程序中的字体:

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

reference

答案 3 :(得分:0)

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

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