这里有一个类似的问题,其中包含通过将 System.Drawing.FontFamily 转换为 WPF 字体系列的假设解决方案,所有这些都在内存中,没有任何文件 IO:
public static void Load(MemoryStream stream)
{
byte[] streamData = new byte[stream.Length];
stream.Read(streamData, 0, streamData.Length);
IntPtr data = Marshal.AllocCoTaskMem(streamData.Length); // Very important.
Marshal.Copy(streamData, 0, data, streamData.Length);
PrivateFontCollection pfc = new PrivateFontCollection();
pfc.AddMemoryFont(data, streamData.Length);
MemoryFonts.Add(pfc); // Your own collection of fonts here.
Marshal.FreeCoTaskMem(data); // Very important.
}
public static System.Windows.Media.FontFamily LoadFont(int fontId)
{
if (!Exists(fontId))
{
return null;
}
/*
NOTE:
This is basically how you convert a System.Drawing.FontFamily to System.Windows.Media.FontFamily, using PrivateFontCollection.
*/
return new System.Windows.Media.FontFamily(MemoryFonts[fontId].Families[0].Name);
}
这似乎使用System.Drawing.PrivateFontCollection
( ^ ) 添加从 aSystem.Drawing.Font
创建的 a MemoryStream
,然后使用该Families[0].Name
字体的 传递给System.Windows.Media.FontFamily
构造函数。我假设姓氏将是 PrivateFontCollection 中该字体实例的 URI,但您可能必须尝试一下。