如何解决WPF:当字体存储在DLL中时,如何在我的EXE中显示自定义字体
在我的解决方案中,我有两个项目:
-
Main
是WPF可执行文件。 -
Lib
是WPF用户控件库。
库设置为对 Main 的引用。
在库中
有两个文件夹:
-
Views
,其中包含UserControlMyView
。 -
Fonts
,其中包含字体MyFont.ttf
。
我已将 MyFont.ttf 包含在 Lib 中,并将其BuildAction
设置为Resource
。
这是 MyView 的XAML代码:
<UserControl x:Class="Lib.Views.MyView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Lib.Views"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800">
<UserControl.Resources>
<Style x:Key="Foo">
<Setter Property="TextElement.FontFamily" Value="pack://application:,/Fonts/#MyFont" />
</Style>
</UserControl.Resources>
<TextBlock Text="asdf" Style="{StaticResource Foo}" />
<TextBlock Text="asdf" />
</UserControl>
注意:有两个TextBlock用于比较。
结果
在MyView的设计器中,第一个TextBlock具有所需的字体。 太好了!
在主要
在我的MainWindow.xaml
中,我有这段代码显示 MyView :
<Window x:Class="Main.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Main"
xmlns:lib="clr-namespace:Lib.Views;assembly=Lib"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<lib:MyView />
</Grid>
</Window>
结果
在MainWindow的设计器中和运行时; MyView 中第一个TextBlock的字体没有正确的字体。相反,它具有默认字体,如 MyView 中的第二个TextBlock一样。
问题
我认为这是因为 MyFont 没有完全/正确地嵌入 Lib 中,因此 Main 无法正确获取字体。
此设置可能是什么问题?
解决方法
更改包URI,以引用包含字体文件的引用程序集。
<Setter Property="TextElement.FontFamily" Value="pack://application:,/Lib;component/Fonts/#MyFont" />
您使用的包URI语法是指local assembly,这是从主机应用程序加载资源时的Main
程序集。
改编的包URI指定该字体位于Lib
程序集中。 component
指定从本地程序集引用此程序集,该程序集仅适用于Lib
程序集和引用该程序集的Main
程序集。
有关包URI语法的更多信息,请参阅documentation。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。