WPF - 从流加载字体?

时间:2008-09-04 18:25:22

标签: wpf fonts stream

我有一个带有字体文件(.ttf)内容的MemoryStream,我希望能够从该流创建一个FontFamily WPF对象没有将流的内容写入磁盘。我知道使用System.Drawing.FontFamily可以实现这一点,但我无法找到如何使用System.Windows.Media.FontFamily进行此操作。

注意:我只会有流,所以我无法将其作为资源包装在应用程序中,并且由于磁盘权限问题,将无法将字体文件写入磁盘以供参考作为“内容”< / p>

2 个答案:

答案 0 :(得分:1)

我能想到的最好的方法是将oldFont保存到临时目录,然后立即使用接受uri的newFont构造函数加载它。

答案 1 :(得分:1)

有一个类似的问题here,其中包含通过将 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(^) 添加从 System.Drawing.Font 创建的 MemoryStream 然后使用该字体的 Families[0].Name 传递进入 System.Windows.Media.FontFamily 构造函数。我假设姓氏将是 PrivateFontCollection 中该字体实例的 URI,但您可能必须尝试一下。