To będzie załadować czcionkę do prywatnej kolekcji czcionek i uniknąć jakiegokolwiek odniesienia do obiektu i pamięci błędy w czasie wykonywania, które możesz zobaczyć, korzystając z powyższych przykładów.
Ze względów wydajności chcieliśmy tylko raz załadować czcionkę i zachować odniesienia do czcionki dla wielu operacji rysowania między połączeniami. Sztuką jest upewnienie się, że PrivateFontCollection
nie wykracza poza zakres, jeśli zachowujesz odniesienie do utworzonego obiektu Font
.
Dodaj kilka statycznych (udostępnianych) zmienne
Private Shared _sharedFont As Font
Private Shared _sharedFontCollection As Text.PrivateFontCollection
Private Shared _sharedFontSize As Integer
Następnie deklarować te funkcje
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
i
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
stosować w następujący sposób:
Dim font = LoadSharedFont("OpenSans-CondBold.ttf", 12, FontStyle.Bold)
i jak zmienić czcionkę etykiety po tym? – Ladessa
Spróbuj tego 'label.Font = new Font (pfc.Families [0], 18, FontStyle.Regular);' – KF2
Otrzymuję zerowy wyjątek w 'Stream fontStream = this.GetType(). Assembly.GetManifestResourceStream (" BOOKOS .TTF "); ' ale już dodałem plik czcionki w zasobach. * Właściwość * build * BOOKOS.TFF jest osadzona ... to prawda? – Ladessa