2017-10-06 90 views
1

我正在构建使用另一个程序集的ResourceDictionaries的应用程序,并且遇到使用字体的问题。XAML - 使用来自另一个程序集的资源字典中的字体

有一个名为的程序集,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工作和正确命名。我在具有相同结构的单个exe项目中使用了<FontFamily x:Key="MyFontKey">Fonts/#MyFontName</FontFamily>实现,并且一切都很好,当我将实现拆分为几个程序集时,就像我所描述的那样,在重构期间出现问题。
  • MyFontAssembly正确合并在MyStylesAssembly中。我只是在这里用这个名称来称呼它,在实际的代码中,它还有一些ResourceDictionaries,它们被MyStylesAssembly正确使用。这个问题似乎只与<FontFamily>标签不能识别ttf文件。
  • MyFontAssemblyMyStylesAssembly是tyle ClassLibrary的项目和不包含比其他ResourceDictionaries任何代码(没有类或后面代码)
+0

你使用了正确的refrence。如果不工作,需要引用XAML URI包文档约定 – Ramankingdom

+0

我很可能不使用正确的方式来引用字体,但我不知道什么是正确的方式来做到这一点(这是我的问题,在这里)。 –

+0

更新示例 – Ramankingdom

回答

1

找到了答案here。我必须设置build actionresource,然后通过使用引用它们:

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

或较短的版本:

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

创建WPF类Library.Lets说FontLibraryCommon enter image description here

现在删除App.Xaml和MainWIndow.Xaml,如下所示 enter image description here

现在更改项目性质类库和编译

enter image description here

现在添加字体文件夹和现有文件TTF在它之下,如图所示。我使用的字体太平洋例如 enter image description here enter image description here

现在添加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> 
+0

这几乎是我在我的应用程序中所做的。 (当你创建一个新项目时还有一个ClassLibrary项目类型,所以你不必删除App.xaml并改变输出类型) –

+0

那么你面临的是什么问题?它只会在运行时工作 – Ramankingdom

1

这里是从输精管库中引用一个字体的一种方式。 说我们有图书馆称为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" > 

现在,这里是TextBlockstyle重用你AwesomeFontsLibrary字体两个片段:

风格:

<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

你的新字体我时,必须使用动态资源,而不是静态的资源,不会出现在设计器窗口中,但是在运行时会起作用。

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

+0

使用DynamicResource而不是StaticResource可以工作。我没有想过。无论如何,我已经找到了解决我的问题在堆栈上的另一个问题。我必须将我的字体文件构建操作设置为资源,并且它可以工作。 –