Понадобилось грузить TTF-шрифты из файлов, что делается с помощью PrivateFontCollection.AddFontFile(FileName)
. И, внезапно, стал проявляться плавающий глюк, возникающий, если периодически пересоздавать объект PrivateFontCollection
. Например, при попытке сделать MeasureString(Text, LoadedFont).ToSize()
, программа стала вываливаться с ошибкой "Попытка чтения или записи в защищенную память"
.
Пишут, что это глюк Framework’а и толковое решение только одно, создавать PrivateFontCollection
один раз при запуске программы, например, в каком-нибудь статическом классе, и больше ее не трогать. Т.е. подгружать новые шрифты можно, а пересоздавать коллекцию не надо.
Минус решения — можно загадить память подгружаемыми шрифтами, если подгрузить много файлов. Но лучше пока ничего не нашел.
В принципе, можно создать вот такой статический класс, который будет подгружать шрифт в коллекцию, и хранить в Dictionary
сопоставление между именем файла и шрифтом в коллекции. Если файл еще не был загружен — подгружать, если был, возвращать позицию в коллекции.
Ну и чтоб два раза не вставать, класс FileFont, который заодно меняет параметры шрифта (размер и начертание).
На Cyberforum’е тоже пока ничего более дельного не предложили.
Pingback: C# Пример Charmap (таблицы символов) для различных кодировок. | Персональный блог Толика Панкова