首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WPF -从流中加载字体?

WPF -从流中加载字体?
EN

Stack Overflow用户
提问于 2008-09-04 18:25:22
回答 2查看 2.3K关注 0票数 24

我有一个包含字体文件(.ttf)内容的MemoryStream,我希望能够从该流创建一个FontFamily WPF对象,而无需将流的内容写入磁盘。我知道用System.Drawing.FontFamily可以做到这一点,但是我不知道用System.Windows.Media.FontFamily怎么做。

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

更新:

API docs如何描述如何使用应用程序资源,尽管我不清楚它是程序集中嵌入资源还是磁盘上的文件。

当引用打包为应用程序一部分的字体时,可以使用基URI值。例如,基URI值可以是"pack:// application“URI,它允许您引用打包为应用程序资源的字体。下面的代码示例显示由基URI值和相对URI值组成的字体引用。

EN

回答 2

Stack Overflow用户

发布于 2011-09-07 23:12:08

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

票数 1
EN

Stack Overflow用户

发布于 2021-01-11 14:41:22

还有一个类似的问题here,它包含一个假设的解决方案,将System.Drawing.FontFamily转换为WPF字体系列,所有这些都在内存中,没有任何文件IO:

代码语言:javascript
复制
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(^)添加从MemoryStream创建的System.Drawing.Font,然后使用该字体的Families[0].Name传递给System.Windows.Media.FontFamily构造函数。我假设家族名称将是PrivateFontCollection中该字体实例的URI,但您可能必须尝试一下。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档