Ich habe versucht, sie mit der Methode PrivateFontCollection.AddFontFile(string) zu laden. Die Schriftart sollte ordnungsgemäß geladen werden, da ich keine Ausnahmen erhalte und ich auch die Schriftfamilien der Sammlung iteriere und die Schriftart vorhanden ist. Das hat leider ein Problem: Es funktioniert nicht. Der Text wird mit der Fallback-Schriftart gerendert.
Ich habe sogar versucht, dieses Beispiel von Microsoft auszuführen. Ohne die Schriftart zu installieren:

Nach der Installation der Schriftart:

Bitte beachten Sie das für den Fall Die Schriftartdateien befinden sich im erwarteten Verzeichnis. Andernfalls würde das Programm nicht ausgeführt.
Das Obige ist völlig nutzlos, da ich möchte, dass die Benutzer ihre Schriftarten direkt in einem Verzeichnis ablegen können, da sie möglicherweise nicht über alle Administratorrechte verfügen um eine Schriftart zu installieren. Das Einbetten der Schriftart als Ressource hilft auch nicht, da dadurch die Flexibilität verloren geht.
Ist es möglich, eine Schriftart aus einer Datei zu laden, ohne sie zu installieren?
Ich versuche es gerade .NET Framework 4.8 Windows 10.0.19045
Nachtrag
Ja, ich weiß, dass ich keinen Code gepostet habe. Der Code befindet sich jedoch in dem Beispiel, das ich verlinkt habe. Zugegeben, im Internet gibt es mehr tote als aktive Links. Hier ist also eine leicht modifizierte Version des Beispiels, auf dem die Screenshots basieren:
Code: Select all
public partial class Form1 : Form
{
private FontFamily[] fontFamilies;
public Form1()
{
InitializeComponent();
PrivateFontCollection privateFontCollection = new PrivateFontCollection();
string[] ttfFiles = Directory.GetFiles("path to the fonts", "*.ttf");
foreach (string ttfFile in ttfFiles)
{
privateFontCollection.AddFontFile(ttfFile);
}
fontFamilies = privateFontCollection.Families;
Disposed += (_, _) =>
{
Console.WriteLine("Disposing");
privateFontCollection.Dispose();
};
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
PointF pointF = new PointF(10, 0);
SolidBrush solidBrush = new SolidBrush(Color.Black);
int count = 0;
count = fontFamilies.Length;
for (int j = 0; j < count; ++j)
{
string familyName = fontFamilies[j].Name;
if (fontFamilies[j].IsStyleAvailable(FontStyle.Regular))
{
Font regFont = new Font(
familyName,
16,
FontStyle.Regular,
GraphicsUnit.Pixel);
e.Graphics.DrawString(
$"{familyName} {FontStyle.Regular}",
regFont,
solidBrush,
pointF);
pointF.Y += regFont.Height;
}
//so on and so forth for the rest of the styles
pointF.Y += 10;
}
}
}