2009-05-24 7 views
2

Je voudrais charger une police à partir d'un serveur externe et une fois chargé (je pense que c'est nécessaire), utilisez-le pour créer quelques champs de texte.Charger la police externe et l'utiliser en C#

Je suis en train:

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

Mais il crée le textblock avec la police par défaut. Des idées?

Merci à l'avance :)

Répondre

5

Si vous pouvez le charger dans un flux, essayez d'utiliser un PrivateFontCollection. Exemple de code dans my answer to another question.

EDIT: Voir System.Net.WebRequest.GetRequestStream, charger l'URI dans un flux, puis charger ce flux dans le PFC comme mentionné dans le code lié.

En outre, je voudrais enregistrer le fichier localement, et le chercher d'abord, de sorte que vous n'avez pas à le télécharger chaque fois que vous exécutez le programme.

ÉDITER À NOUVEAU: Désolé, pas WebRequest.GetRequestStream, vous voulez WebResponse.GetResponseStream(). Voici quelques exemples de code pour faire exactement ce que vous cherchez.

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

: S Y a-t-il un moyen plus simple? Le problème est que je ne peux pas le faire fonctionner quand j'ai la police dans "Ressources", donc je cherche la solution la plus simple. – ozke

+0

Je ne voulais pas le charger à partir d'une ressource, mais essayer de comprendre comment télécharger votre police à partir de l'URL spécifiée dans une sorte de Stream (FileStream, MemoryStream, etc ...), puis le charger dans le PFC . Ne vous inquiétez pas de la partie ressource du code que j'ai lié. –

0

Le nom de famille que vous transmettez au constructeur FontFamily est-il réellement un nom de famille exposé par le fichier de police? Dans votre exemple, si vous avez chargé Wingding.ttf, le nom de la famille de polices serait Wingdings et non bf_helvetica. Si le fichier de police est bf_helvetica.ttf, le nom de famille est probablement autre chose que le nom de la police, comme Helvetica ou Helvetica Bold.

Questions connexes