Загрузите и используйте шрифт штрих-кода в TextBlock

Эй, я пытаюсь создать поле ввода BarCode. На нем текстовый блок показывает предварительный просмотр того, как будет выглядеть ввод текста в указанном типе штрих-кода. У меня есть куча файлов.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, быстрые часы указывают на это.

В классе 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);

И он по-прежнему показывает шрифт по умолчанию.

3 ответа

Решение
<FontFamily x:Key="MyFont">/WpfTest;component/Resources/#Airplanes in the Night Sky</FontFamily>

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

Учитывая, что когда вы открываете.ttf, "Font name: .." - это "Самолеты в ночном небе", а пространство имен вашего проекта - "WpfTest", и вы перетаскиваете шрифт в папку с именем "Resources".

Я не знаю, какой метод вы используете, но я успешно встраивал шрифты в приложение WPF, добавив файлы в проект в качестве ресурсов, а затем создав ресурс WPF/XAML в разметке для ссылки на файл шрифта. (используя пачку Ури). Это не требует установки шрифтов на компьютере - они встроены в ваш.exe или.dll файл.

Я не нашел никакого ответа именно для этого. Но я нашел решение, которого не увидел в интернете.

Я последовал рекомендации сделать папку и пометить все файлы внутри как ресурсы. Но мне нужно было перечислить их, и это была моя главная проблема, потому что мне нужно было загрузить все на мой экран, не записав где-нибудь имя. Я просто хочу просто добавить другой шрифт в эту папку и перечислить его.

Я нашел это как решение, чтобы перечислить все файлы внутри моего resources/fonts папка

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

Я ожидаю, что это поможет вам организовать ваши шрифты.

Другие вопросы по тегам