Загрузите внешний шрифт и используйте его в C # - PullRequest
2 голосов
/ 25 мая 2009

Я хотел бы загрузить шрифт с внешнего сервера и после загрузки (думаю, это необходимо) использовать его для создания нескольких текстовых полей.

Я пытаюсь:

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);

Но он создает текстовый блок со шрифтом по умолчанию. Есть идеи?

Заранее спасибо:)

Ответы [ 3 ]

5 голосов
/ 25 мая 2009

Если вы можете загрузить его в поток, попробуйте использовать PrivateFontCollection . Пример кода в мой ответ на другой вопрос .

РЕДАКТИРОВАТЬ : См. System.Net.WebRequest.GetRequestStream , загрузить URI в поток, а затем загрузить этот поток в 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);
                }
            }
        }
    }
}
0 голосов
/ 29 октября 2010

Я опубликовал решение для шрифтов истинного типа, но оно может работать с другими типами.

C # КАК ДОБАВИТЬ TTF в проект в Visual Studio

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

Надеюсь, это поможет.

0 голосов
/ 25 мая 2009

Действительно ли фамилия, которую вы передаете конструктору FontFamily, является фамилией, представленной файлом шрифта? В вашем примере, если вы загрузили Wingding.ttf, имя семейства шрифтов будет Wingdings, а не bf_helvetica. Если файл шрифта bf_helvetica.ttf, скорее всего, имя семейства отличается от имени шрифта, например Helvetica или Helvetica Bold.

...