我在使用Visual Studio 2013的C#WPF .NET 4.0应用程序(特别是Open Sans和FontAwesome)中使用了一些自定义字体。
我有:
以下是我在资源词典中创建的样式I的片段:
<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>
现在,在一个新的用户控件中,我创建纯粹是为了测试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." />
FontAwesome可以在我的PC和另一台没有安装FoneAwesome的PC上运行时在设计器中运行。
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之间存在模糊的问题?
答案 0 :(得分:6)
发现&amp;溶液强>
我无法分辨为什么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>
请注意,此属性的值首先是“Open Sans”,然后是逗号,是项目中包含的字体的URI。 (提醒一下,您需要确保字体资源的属性是“构建操作属性”下的“资源”类型(右键单击解决方案资源管理器中的字体文件。)
此语法通知WPF使用列出的第一个字体(如果不可用),然后回退到第二个字体系列,依此类推。
这是(可能)更好的解决方案,因为它询问系统是否已经可以使用所需的字体(在此示例中为Open Sans)。如果是这样,它使用该系统字体,如果没有,它将加载嵌入的字体文件资源。
这提供了一些好处:
此设置使VS Designer使用Open Sans(在此示例中)显示使用它们的字体,因此我可以设计并查看相关字体。
此设置还允许首先从系统加载使用了字体的计算机,如果未找到,则从资源加载。
我希望这对使用Open Sans(或其他字体)的其他人有益,因为某些原因这些字体不会出现在VS Designer中,除非直接作为系统字体引用。