【问题标题】:Load and use barcode font in TextBlock在 TextBlock 中加载和使用条形码字体
【发布时间】:2011-08-17 19:03:49
【问题描述】:

嘿,我正在尝试创建一个条形码输入框。在其上,文本块显示了指定条形码类型中文本输入的预览。 我有一堆 .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);

它仍然显示默认字体。

【问题讨论】:

    标签: c# .net wpf privatefontcollection


    【解决方案1】:
    <FontFamily x:Key="MyFont">/WpfTest;component/Resources/#Airplanes in the Night Sky</FontFamily>
    
    <TextBlock FontFamily="{StaticResource MyFont}">Hello world</TextBlock>
    

    鉴于当您打开 .ttf 时,“字体名称:..”是“夜空中的飞机”并且您的项目命名空间是“WpfTest”,并且您将字体拖到名为“资源”的文件夹中

    【讨论】:

    • 当我测试它时对我来说工作得很好,你确定你将 WpfTest 重命名为你的项目命名空间名称并且你的字体在一个名为 Resources 的文件夹中,字体上的 Build Action 是“Resources”,你将 FontFamily 声明放在您正在使用它的 xaml 文件的资源部分,并将“Airplanes..”更改为打开 ttf 文件时看到的字体名称?
    • 呃!就是这样,非常感谢,我最缺少的是构建资源的操作。
    • 我需要这个,因为将它作为静态资源不允许我选择要使用的 FontFamily,理想情况下我可以将 TextBlock 绑定到 Barcode 对象提供的 FontFamily。
    • text2.FontFamily = new FontFamily(new Uri("pack://application:,,,"), "WpfTest;component/Resources/#Cactus Sandwich Plain FM");
    【解决方案2】:

    我不知道您使用的方法,但我之前已经成功地将字体嵌入到 WPF 应用程序中,方法是将文件作为资源添加到项目中,然后在标记中创建 WPF/XAML 资源以供参考字体文件(使用 pack Uri)。这不需要在机器上安装字体 - 它们嵌入在您的 .exe 或 .dll 文件中。

    【讨论】:

    • 你能发布一个代码示例吗?理想情况下,我需要从代码中设置 FontFamily,以便我的控件可以绑定到它,因为我的条形码对象可以改变类型,从而改变它使用的 fontfamily。
    【解决方案3】:

    我没有找到任何答案。 但是我找到了一个我在网上没有看到的解决方案。

    我遵循了创建文件夹并将其中的所有文件标记为资源的建议。 但我需要枚举它们,这是我的主要问题,因为我需要将所有内容加载到我的屏幕上,而不需要在某处记录名称。我只想简单地将另一种字体拖放到该文件夹​​并列出它。

    我发现这是列出我的 resources/fonts 文件夹中所有文件的解决方案

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

    我希望它可以帮助您组织字体。

    【讨论】:

      猜你喜欢
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2015-12-07
      • 2017-04-04
      • 2012-03-16
      相关资源
      最近更新 更多