嘿,我正在尝试创建一个条形码输入框。在其上,文本块显示了指定条形码类型中文本输入的预览。我有一堆 .TTF 文件是条形码字体,它们已在 WinForms 应用程序中使用,所以我确信它们是正确的。我尝试使用以下方法将它们加载到内存(不想安装它们):
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,quickwatch 表明如此。
在 Barcode 类中,我有一个 MyFontFamily 属性,其中包含与加载的文件对应的 System.Media.FontFamily。这个属性是这样加载的:
MyFontFamily = new System.Windows.Media.FontFamily(sBarCodeFonts.Families[0].Name);
它似乎也正确加载。
然后,我有一个 Barcode 对象,我使用 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);
它仍然显示默认字体。