我在使用Visual Studio 2013的C#WPF .NET 4.0应用程序(特别是Open Sans和FontAwesome)中使用了一些自定义字体.
我有:
这是我在资源字典中创建的样式的片段:
<Style x:Key="OpenSans">
<Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Fonts/#Open Sans" />
</Style>
<Style x:Key="FontAwesome">
<Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Fonts/#FontAwesome" />
</Style>
Run Code Online (Sandbox Code Playgroud)
现在,在一个新的用户控件中,我创建纯粹是为了测试Designer并正确包含这些字体,我编写了以下XAML:
<TextBlock Style="{StaticResource FontAwesome}" FontSize="64" Text="" />
<TextBlock Style="{StaticResource OpenSans}" FontSize="48" Text="the quick brown fox jumped over the lazy dog." />
<TextBlock FontFamily="Open Sans" FontSize="48" Text="the quick brown fox jumped over the lazy dog." />
Run Code Online (Sandbox Code Playgroud)
FontAwesome在设计器中运行,在我的PC和另一台PC上运行时没有安装FoneAwesome.
OpenSans样式不会显示在设计器中,但会在执行时显示,包括在未安装Open Sans的其他PC上执行.
Open Sans FontFamily选项显示在设计器中,但未安装Open Sans(预期)的其他PC上不显示.
问题
我希望能够使用Designer在设计时看到给定我提供的字体时UI的样子.利用我创建的样式,我可以在Designer中看到FontAwesome图标,但不能看到Open Sans字体.我可以在两者之间区别的唯一区别是FontAwesome是一个Open-Type字体,而Open Sans是一个True-Type字体.
有没有人知道我是否忽略了一些简单的事情,或者是否在VS设计器中OTF和TTF之间存在模糊的问题?
发现和解决方案
我无法分辨为什么Open Sans不在VS Designer中渲染.我所做的每次尝试强制它使用Open Sans(来自附加到项目的字体资源)都会失败,并且Designer会回退到默认字体.
使用与FontAwesome相同的方法按预期工作,因此VS中的字体渲染系统有一些我无法解释的元素.
但是,我提出了一个很好的(可能更好的?)解决方案,以及我不了解WPF中字体选择的提示:
WPF中的FontFamily属性支持回退值,例如:
<Style x:Key="OpenSans">
<Setter Property="TextElement.FontFamily" Value="Open Sans, /<project name>;component/Fonts/#Open Sans" />
</Style>
Run Code Online (Sandbox Code Playgroud)
请注意,此属性的值首先是"Open Sans",然后是逗号,即包含在项目中的字体的URI.(提醒一下,您需要确保字体资源的属性是"构建操作属性"下的"资源"类型(右键单击解决方案资源管理器中的字体文件.))
此语法通知WPF使用列出的第一个字体(如果不可用),然后回退到第二个字体系列,依此类推.
这是(可能)更好的解决方案,因为它询问系统是否已经可以使用所需的字体(在此示例中为Open Sans).如果是这样,它使用该系统字体,如果不是,它将加载嵌入的字体文件资源.
这提供了一些好处:
此设置使VS Designer使用Open Sans(在此示例中)显示使用它们的字体,因此我可以设计并查看相关字体.
此设置还允许首先从系统加载使用了字体的计算机,如果未找到,则从资源加载.也许是一个具有表现意识的小项目,但仍然有益.
我希望这对使用Open Sans(或其他字体)的其他人有益,因为某些原因这些字体不会出现在VS Designer中,除非直接作为系统字体引用.