首页 > 解决方案 > WPF:当字体存储在 DLL 中时,如何在我的 EXE 中显示自定义字体

问题描述

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

Lib设置为对Main的引用。

在库中

有两个文件夹:

我已将MyFont.ttf包含到Lib中并将其设置BuildActionResource.

这是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 的字体没有正确的字体。相反,它具有默认字体,就像MyView中的第二个 TextBlock 一样。

问题

我认为这必须这样做MyFont没有完全/正确地嵌入到Lib中,因此Main不能正确获取字体。

这个设置可能有什么问题?

标签: c#wpffontsuser-controls

解决方案


更改包 URI 以引用包含字体文件的引用程序集。

<Setter Property="TextElement.FontFamily" Value="pack://application:,,,/Lib;component/Fonts/#MyFont" />

您使用的包 URI 语法是指本地程序集,即Main从主机应用程序加载资源时的程序集。

适配的包 URI 指定字体位于Lib程序集中。指定此程序集是从本地程序集引用的component,它既适用于Lib单独的程序集,也适用于Main引用它的程序集。

有关 pack URI 语法的更多信息,请参阅文档


推荐阅读