WPF:当字体存储在 DLL 中时如何在我的 EXE 中显示自定义字体

WPF: How to display a custom font in my EXE when font stored in a DLL

在我的解决方案中,我有两个项目:

Lib 设置为参考 Main.

在库中

有两个文件夹:

我已将 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