Загрузите и используйте шрифт штрих-кода в 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/#"))
Я ожидаю, что это поможет вам организовать ваши шрифты.