2011-05-03 15 views
1

嘿,我想創建一個條形碼輸入框。在它上面,文本塊顯示了文本輸入在指定的條碼類型中的樣子。 我有一堆.TTF文件是條形碼字體,它們已用於WinForms應用程序,所以我相信它們是正確的。我試圖把它們加載到內存(不想安裝它們)使用:加載和使用TextBlock中的條形碼字體

sBarCodeFonts = new PrivateFontCollection(); 
     unsafe 
     { 
      fixed (byte* p = Resources.Code39) 
      { 
       IntPtr MyIntPtr = (IntPtr)p; 
       sBarCodeFonts.AddMemoryFont(MyIntPtr, Resources.Code39.Length); 
      } 

      fixed (byte* p = Resources.Code128b) 
      { 
       IntPtr MyIntPtr = (IntPtr)p; 
       sBarCodeFonts.AddMemoryFont(MyIntPtr, Resources.Code128b.Length); 
      } 

      fixed (byte* p = Resources.i2of5) 
      { 
       IntPtr MyIntPtr = (IntPtr)p; 
       sBarCodeFonts.AddMemoryFont(MyIntPtr, Resources.i2of5.Length); 
      } 

      fixed (byte* p = Resources.ean13) 
      { 
       IntPtr MyIntPtr = (IntPtr)p; 
       sBarCodeFonts.AddMemoryFont(MyIntPtr, Resources.ean13.Length); 
      } 
     } 

這似乎正確加載PrivateFontCollection,快速監視指示等等。

在Barcode類中,我有一個MyFontFamily屬性,其中包含對應於加載文件的System.Media.FontFamily。 這個屬性被加載這樣的:

MyFontFamily = new System.Windows.Media.FontFamily(sBarCodeFonts.Families[0].Name); 

而且它似乎正確加載爲好。

然後,我有一個條形碼的對象,我使用一個TextBlock來顯示它的文本,使用它的FontFamily:

<TextBlock Text="{Binding Path=MyBarcode.TextContent, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}, Mode=OneWay}" 
        FontFamily="{Binding Path=MyBarcode.MyFontFamily, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}, Mode=OneWay}" 
        Name="txt" 
        Grid.Row="2" /> 

TextBlock的顯示每次使用默認字體的文本。我已經調試過,並且FontFamily被正確設置爲之前C#代碼中加載的一個。

任何線索?

謝謝。

編輯: 試圖簡化問題,我創建了一個非常快速和骯髒的測試應用程序加載TTF和表現出來,這是唯一的代碼(除了XAML只有一格):

System.Windows.Media.FontFamily lFamily = new System.Windows.Media.FontFamily(new Uri(@"E:\Prototypes\TestApp\Resources\Code128b.ttf", UriKind.Absolute), "Code128bWin"); 
      TextBlock lTextBlock = new TextBlock(); 
      lTextBlock.Text = "jsldkasjLKJOSDIFUEWR32849792837.,´` "; 
      lTextBlock.FontFamily = lFamily; 
      lTextBlock.FontSize = 50.0; 
      grid.Children.Add(lTextBlock); 

它仍然顯示默認字體。

回答

2
<FontFamily x:Key="MyFont">/WpfTest;component/Resources/#Airplanes in the Night Sky</FontFamily> 

<TextBlock FontFamily="{StaticResource MyFont}">Hello world</TextBlock> 

既然當您打開的.ttf「字體名稱:..」是「在夜空飛機」和你的項目命名空間是「WpfTest」你拖的字體到一個名爲「資源文件夾「

+0

這沒有奏效:( – 2011-05-03 16:28:27

+0

工作正常,當我測試它時,你確定你已將WpfTest重命名爲你的項目命名空間名稱,並且你的字體位於名爲Resources的文件夾中,字體上的Build Action是「Resources」,而你將FontFamily聲明放入您使用的xaml文件的參考資料部分,並將「Airplanes ..」更改爲打開ttf文件時看到的字體名稱? – 2011-05-03 17:24:05

+0

Duh!就是這樣,非常感謝您,我錯過的主要是構建資源的行動 – 2011-05-03 20:58:08

0

我不知道你正在使用的方法,但我已經成功地將字體嵌入到WPF應用程序中,然後通過將文件作爲資源添加到項目中,然後在標記中創建WPF/XAML資源參考字體文件(使用一個包Uri)。這不需要在機器上安裝字體 - 它們嵌入在.exe或.dll文件中。

+1

你可以發佈代碼示例嗎?理想情況下,我需要從代碼中設置FontFamily,以便我的控件可以綁定到它,因爲我的條形碼對象可以在類型中更改,因此可以在它使用的fontfamily中更改。 – 2011-05-03 15:07:48

0

我完全沒有找到任何答案。 但我發現了一個我在互聯網上沒有看到的解決方案。

我遵循了建立一個文件夾並將所有文件標記爲Resources的建議。 但我需要枚舉它們,這是我的主要問題,因爲我需要將所有內容全部加載到我的屏幕上,而無需在某處記錄名稱。我只想簡單地將另一種字體拖放到該文件夾​​並列出它。

,我發現這是一個解決方案,列出我resources/fonts文件夾

Fonts.GetFontFamilies(new Uri("pack://application:,,,/resources/fonts/#")) 

裏面的所有文件,我希望它幫你整理字體。

相關問題