#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/#"))
Я ожидаю, что это поможет вам упорядочить ваши шрифты.