Это загрузит шрифт в частной коллекции шрифтов, а также избегать каких-либо ссылок на объект и память которые вы можете увидеть, используя приведенные выше примеры.
По соображениям производительности мы хотели только загрузить шрифт один раз и сохранить ссылки на шрифт для нескольких операций рисования между вызовами. Хитрость заключается в том, чтобы гарантировать, что PrivateFontCollection
не выходит за пределы области действия, если вы сохраняете ссылку на созданный объект Font
.
Добавить некоторые статические (общий) переменные
Private Shared _sharedFont As Font
Private Shared _sharedFontCollection As Text.PrivateFontCollection
Private Shared _sharedFontSize As Integer
Тогда объявляют эти функции
Private Function LoadSharedFont(ByVal fontName As String, ByVal size As Integer, ByVal style As FontStyle) As Font
'Check if font name or size has changed, then clear cache
If size <> _sharedFontSize Then _sharedFont = Nothing
If _sharedFont Is Nothing Then
'Make this shared so this variable doesnt go out of scope and is garbage collected
_sharedFontCollection = New Text.PrivateFontCollection()
_sharedFont = LoadFont(fontName, size, style)
_sharedFontSize = size
End If
Return _sharedFont
End Function
и
Private Function LoadFont(ByVal fontName As String, ByVal size As Integer, ByVal style As FontStyle) As Font
Dim executingAssembly As System.Reflection.Assembly = Reflection.Assembly.GetCallingAssembly()
Dim myNamespace As String = executingAssembly.GetName().Name.ToString()
Try
Using fontstream = executingAssembly.GetManifestResourceStream(myNamespace + "." + fontName)
Dim fontBytes(CInt(fontstream.Length)) As Byte
fontstream.Read(fontBytes, 0, CInt(fontstream.Length))
Dim fontData As System.IntPtr = Marshal.AllocCoTaskMem(fontBytes.Length)
Marshal.Copy(fontBytes, 0, fontData, fontBytes.Length)
_sharedFontCollection.AddMemoryFont(fontData, fontBytes.Length)
Marshal.FreeCoTaskMem(fontData)
End Using
Return New Font(_sharedFontCollection.Families(0), size, style)
Catch ex As Exception
'An unexpected error has occurred so return a default Font just in case.
Return New Drawing.Font("Arial", size, FontStyle.Regular)
End Try
End Function
Использование следующим образом:
Dim font = LoadSharedFont("OpenSans-CondBold.ttf", 12, FontStyle.Bold)
и как изменить шрифт метки после этого? – Ladessa
Попробуйте это: label.Font = new Font (pfc.Families [0], 18, FontStyle.Regular); ' – KF2
Я получаю null исключение в' Stream fontStream = this.GetType(). Assembly.GetManifestResourceStream ("BOOKOS ,TTF "); ', но я уже добавил файл шрифта в ресурсы. Свойство * build * для BOOKOS.TFF является встроенным ... это правильно? – Ladessa