6

我正在构建一个使用ResourceDictionaries其他程序集的应用程序,但我在使用字体时遇到了问题。

有一个名为MyFontAssembly的程序集,它将字体以及对它们的引用存储为ResourceDictionary. 它的结构如下所示:

MyFontAssembly
    - FontDictionary.xaml - (stores references to fonts)
    - Fonts
        - FontA.ttf
        - FontB.ttf
          ...

还有另一个程序集存储ResourceDictionaries样式控件,它称为MyStylesAssembly。然后将来自 MyStylesAssembly 的 ResourceDictionaries 合并到应用程序的 App.xaml 中,以提供可重用的样式。

问题是我的样式确实识别字体资源(代码没有崩溃,因为它无法通过它的键找到资源),但看起来存储为 ttf 文件的字体没有被应用。

我在我的 中尝试了以下FontDictionary.xaml方法,但都不起作用:

<FontFamily x:Key="MyFontKey">Fonts/#MyFontName</FontFamily>
<FontFamily x:Key="MyFontKey">pack://application:,,,/MyFontAssemblyName;Component/Fonts/#MyFontName</FontFamily>
<FontFamily x:Key="MyFontKey">/MyFontAssemblyName;Component/Fonts/#MyFontName</FontFamily>
<FontFamily x:Key="MyFontKey">pack://application:,,,/Fonts/#MyFontName</FontFamily>

笔记:

  • 我确信我的字体形式 ttf 可以正常工作并且命名正确。我<FontFamily x:Key="MyFontKey">Fonts/#MyFontName</FontFamily>在具有相同结构的单个 exe 项目中使用实现,一切都很好,当我将实现拆分为几个程序集时出现问题,就像我在重构期间描述的那样。
  • MyFontAssembly已正确合并MyStylesAssembly。我只是在这里用那个名字来称呼它,在实际代码中它还有一些ResourceDictionariesMyStylesAssembly. 问题似乎只是<FontFamily>标签无法识别 ttf 文件。
  • MyFontAssembly并且MyStylesAssembly是类型的项目,ClassLibrary并且不包含除 in 以外的任何代码ResourceDictionaries(没有类或代码后面)
4

3 回答 3

8

在这里找到了答案。我必须设置build actionresource,然后使用以下方法引用它们:

<FontFamily x:Key="MyFontKey">pack://application:,,,/MyFontAssemblyName;Component/Fonts/#MyFontName</FontFamily>

或更短的版本:

<FontFamily x:Key="MyFontKey">/MyFontAssemblyName;Component/Fonts/#MyFontName</FontFamily>
于 2017-10-09T07:22:55.297 回答
3

创建一个 WPF 类库。让我们说 FontLibraryCommon 在此处输入图像描述

现在删除 App.Xaml 和 MainWINdow.Xaml 如下所示 在此处输入图像描述

现在将项目属性更改为类库并编译

在此处输入图像描述

现在如图所示添加字体文件夹和现有的 TTF 文件。例如,我使用 Pacifico 字体 在此处输入图像描述 在此处输入图像描述

现在添加 ResourceDictioanry 让说 FontDictioanry.xaml 在您的库中,您的 xaml 应该如下所示

这是代码

  <ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:FontLibraryCommon">
   <FontFamily x:Key="Pacifico">Fonts/#Pacifico</FontFamily>

 </ResourceDictionary>

现在在您的其他项目中添加字体库作为参考并在您的 MainWindow.Xaml `

<Window.Resources>
    <ResourceDictionary Source="pack://application:,,,/FontLibraryCommon;component/FontDictioanry.xaml"></ResourceDictionary>
</Window.Resources>`

最后让我们说标签你可以这样设置

<Label FontFamily="{StaticResource Pacifico}"> Raman</Label>
于 2017-10-06T10:47:19.343 回答
0

这是从不同库中引用字体的一种方法。假设我们调用了库MyAwesomeFonts,这是它的项目结构:

MyAwesomeFontsLibrary
 |
 |__ Fonts\
 |      |
 |      |__ Fonts.cs
 |      |__ MyAwesomeFont.ttf
 |
 |__ Themes\
        |
        |__ generic.xaml

Fonts\您放置字体的文件夹中,在 generic.xaml 文件中,您通常像这样声明您的字体:

xmlns:fonts="clr-namespace:MyAwesomeFontsLibrary.Fonts"...
<FontFamily 
     x:Key="{ComponentResourceKey TypeInTargetAssembly={x:Type fonts:Fonts}, ResourceId=MyAwesomeFont}">Fonts/#My Awesome Font Name</FontFamily>

并在Fonts.cs文件中包含:

// say this class declared in namespace: MyAwesomeLibrary.Fonts
public class Fonts
{
    public static ComponentResourceKey MyAwesomeFontKey => new ComponentResourceKey(typeof(Fonts), "MyAwesomeFont");
}

对于您拥有的每种字体,您都执行上述相同的操作,将它们添加到Fonts文件夹中,将它们声明为generic.xaml文件中的资源,最后在Fonts.cs

现在构建您的库,在您想要使用它的项目中添加对它的引用,并将 AwesomeFontsLibrary 的命名空间添加到您的 XAML 中,如下所示:

<... xmlns:fonts="clr-namespace:MyAwesomeFontsLibrary.Fonts;assembly=MyAwesomeFontsLibrary" >

TextBlock现在这里有两个在和中重用 AwesomeFontsLibrary 字体的片段style

很有型:

<Style x:Key="MyTextBlockStyle"
           TargetType="TextBlock">
        <Setter Property="FontFamily" Value="{DynamicResource {x:Static fonts:Fonts.MyAwesomeFontKey}}"></Setter>
    </Style>

或直接在文本块中:

    <TextBlock FontFamily="{DynamicResource {x:Static fonts:Fonts.MyAwesomeFontKey}}" FontSize="50">Welcome!</TextBlock>

使用 ComponentResourceKey 时必须使用动态资源,而不是静态资源

您的新字体不会出现在设计器窗口中,但在运行时它将起作用。

上面的步骤在我的机器上进行了测试并且它们有效。希望这会有所帮助。

于 2017-10-06T11:48:55.250 回答