2

我想从外部服务器加载字体,一旦加载(我想这是必要的)使用它来创建一些文本字段。

我正在努力:

font_uri = new Uri("http://localhost/assets/fonts/wingding.ttf");
bf_helvetica = new FontFamily(font_uri, "bf_helvetica");

TextBlock test_tb = new TextBlock();
test_tb.Text = "This is a test";
test_tb.FontSize = 16;
test_tb.Foreground = Brushes.Red;
test_tb.FontFamily = bf_helvetica;
stage.Children.Add(test_tb);

但它使用默认字体创建文本块。有任何想法吗?

提前致谢 :)

4

3 回答 3

6

如果您可以将其加载到 Stream 中,请尝试使用PrivateFontCollection我对另一个问题的回答中的示例代码。

编辑:参见System.Net.WebRequest.GetRequestStream,将 URI 加载到 Stream 中,然后将该 Stream 加载到 PFC 中,如链接代码中所述。

另外,我会将文件保存在本地,然后先在那里查找,这样您就不必每次运行程序时都下载它。

再次编辑:抱歉,不是 WebRequest.GetRequestStream,您需要 WebResponse.GetResponseStream()。这是一些示例代码,可以完全满足您的需求。

using System;
using System.Drawing;
using System.Drawing.Text;
using System.IO;
using System.Net;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace RemoteFontTest
{
    public partial class Form1 : Form
    {
        readonly PrivateFontCollection pfc = new PrivateFontCollection();

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            WebRequest request = WebRequest.Create(@"http://somedomain.com/foo/blah/somefont.ttf");
            request.Credentials = CredentialCache.DefaultCredentials;

            WebResponse response = request.GetResponse();

            using (Stream fontStream = response.GetResponseStream())
            {
                if (null == fontStream)
                {
                    return;
                }

                int fontStreamLength = (int)fontStream.Length;

                IntPtr data = Marshal.AllocCoTaskMem(fontStreamLength);

                byte[] fontData = new byte[fontStreamLength];
                fontStream.Read(fontData, 0, fontStreamLength);

                Marshal.Copy(fontData, 0, data, fontStreamLength);

                pfc.AddMemoryFont(data, fontStreamLength);

                Marshal.FreeCoTaskMem(data);
            }
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            using (SolidBrush brush = new SolidBrush(Color.Black))
            {
                using (Font font = new Font(pfc.Families[0], 32, FontStyle.Regular, GraphicsUnit.Point))
                {
                    e.Graphics.DrawString(font.Name, font, brush, 10, 10, StringFormat.GenericTypographic);
                }
            }
        }
    }
}
于 2009-05-24T23:39:55.950 回答
0

您传递给 FontFamily 构造函数的姓氏实际上是字体文件公开的姓氏吗?在您的示例中,如果您加载了 Wingding.ttf,字体系列名称将是 Wingdings,而不是 bf_helvetica。如果字体文件是 bf_helvetica.ttf,则家族名称可能不是字体名称,例如 Helvetica 或 Helvetica Bold。

于 2009-05-25T04:23:49.017 回答
0

我发布了一个真正类型字体的解决方案,但它可以与其他类型一起使用。

C# 如何在 Visual Studio 中向项目添加 TTF

http://hongouru.blogspot.com/2010/10/c-how-to-add-fonts-ttf-true-type-fonts.html

我希望它有所帮助。

于 2010-10-28T20:00:09.470 回答