WPF:当字体存储在 DLL 中时如何在我的 EXE 中显示自定义字体
WPF: How to display a custom font in my EXE when font stored in a DLL
在我的解决方案中,我有两个项目:
Main
是 WPF 可执行文件。
Lib
是一个 WPF 用户控件库。
Lib 设置为参考 Main.
在库中
有两个文件夹:
Views
,包含用户控件 MyView
。
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>
注意:有两个TextBlocks比较
结果
在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 的字体不正确。相反,它具有默认字体,因为第二个 TextBlock 在 MyView.
中具有
问题
我认为这必须做到 MyFont 没有嵌入 fully/correctly 到 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。
在我的解决方案中,我有两个项目:
Main
是 WPF 可执行文件。Lib
是一个 WPF 用户控件库。
Lib 设置为参考 Main.
在库中
有两个文件夹:
Views
,包含用户控件MyView
。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>
注意:有两个TextBlocks比较
结果
在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 的字体不正确。相反,它具有默认字体,因为第二个 TextBlock 在 MyView.
中具有问题
我认为这必须做到 MyFont 没有嵌入 fully/correctly 到 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。