2017-10-06 110 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可以工作。我沒有想過。無論如何,我已經找到了解決我的問題在堆棧上的另一個問題。我必須將我的字體文件構建操作設置爲資源,並且它可以工作。 –

相關問題