我有一个应用程序,它为资源使用一个单独的库程序集(但不是一个没有代码的资源专用程序集),我想在库中包含一个自定义字体。
如果我将其.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工作,它有一个创建字体资源库的例子,但是没有使用代码的例子(我被迫为此使用代码)。
关于我需要做什么的任何想法?我离开了吗?
答案 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.
}
答案 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");