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

#c# #.net #wpf #privatefontcollection

#c# #.net #wpf #privatefontcollection

Вопрос:

Привет, я пытаюсь создать поле ввода штрих-кода. В нем текстовый блок показывает предварительный просмотр того, как будет выглядеть вводимый текст в указанном типе штрих-кода. У меня есть куча.Файлы 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, которое содержит систему.Медиафайлы.Семейство шрифтов, соответствующее загруженному файлу. Это свойство загружается следующим образом:

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

И, похоже, он также загружен правильно.

Затем у меня есть объект штрих-кода, и я использую текстовый блок для отображения его текста, используя его семейство шрифтов:

 <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" />
  

Текстовый блок каждый раз отображает текст, используя шрифт по умолчанию. Я отладил, и семейство шрифтов правильно установлено на одно из загруженных в предыдущем коде C #.

Есть подсказки?

Спасибо.

РЕДАКТИРОВАТЬ: Пытаясь упростить проблему, я создал очень быстрое и грязное тестовое приложение для загрузки TTF и отображения его, это единственный код (помимо XAML, содержащий только сетку):

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

И он по-прежнему отображает шрифт по умолчанию.

Ответ №1:

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

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

Учитывая, что при открытии .ttf «Имя шрифта: ..» — это «Самолеты в ночном небе», а пространство имен вашего проекта — «WpfTest», и вы перетащили шрифт в папку с именем «Ресурсы»

Комментарии:

1. у меня все работало нормально, когда я тестировал его, вы уверены, что переименовали WpfTest в имя пространства имен вашего проекта, и ваш шрифт находится в папке с именем Resources, а действие сборки над шрифтом — «Resources», и вы поместили объявление FontFamily в раздел ресурсов файла xaml, в котором вы его используете, и вы изменили «Airplanes ..» на название шрифта, которое вы видите при открытии файла ttf?

2. Дух! Вот и все, большое вам спасибо, чего мне больше всего не хватало, так это действия сборки для ресурса.

3. Мне это нужно, потому что наличие его в качестве статического ресурса не позволяет мне выбирать, какое семейство шрифтов я хочу использовать, в идеале я мог бы привязать TextBlock к семейству шрифтов, предоставляемому объектом Barcode.

4. text2.FontFamily = новое семейство шрифтов(новый Uri(«pack://application:,,,»), «WpfTest;компонент / Ресурсы / #Cactus Sandwich Plain FM»);

Ответ №2:

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

Комментарии:

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

Ответ №3:

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

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

Я нашел это как решение для перечисления всех файлов в моей resources/fonts папке

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

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