2009-05-24 12 views
2

Ich möchte eine Schriftart von einem externen Server laden und einmal geladen (ich denke, das ist notwendig) verwenden Sie es, um ein paar Textfelder zu erstellen.Externe Schriftart laden und in C verwenden #

Ich versuche:

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

Aber es schafft den Textblock mit der Standardschriftart. Irgendwelche Ideen?

Vielen Dank im Voraus :)

Antwort

5

Wenn Sie es in einen Strom geladen werden kann, versuchen Sie einen PrivateFontCollection verwenden. Beispielcode in my answer to another question.

BEARBEITEN: Siehe System.Net.WebRequest.GetRequestStream, laden Sie den URI in einen Stream und laden Sie diesen Stream dann in den PFC, wie im verknüpften Code erwähnt.

Außerdem würde ich die Datei lokal speichern und zuerst dort suchen, damit Sie sie nicht jedes Mal herunterladen müssen, wenn Sie das Programm ausführen.

BEARBEITEN SIE WIEDER: Sorry, nicht WebRequest.GetRequestStream, wollen Sie WebResponse.GetResponseStream(). Hier ist ein Beispielcode, um genau das zu tun, wonach Sie suchen.

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 Gibt es keinen einfacheren Weg? Das Problem ist, ich kann es nicht funktionieren, wenn ich die Schriftart in "Ressourcen" habe, also suche ich nach der einfachsten Lösung. – ozke

+0

Ich wollte es nicht von einer Ressource laden, aber versuchen Sie herauszufinden, wie Sie Ihre Schriftart von der angegebenen URL in eine Art Stream (FileStream, MemoryStream, etc ...) herunterladen und dann in die PFC laden . Mach dir keine Sorgen über den Ressourcenteil des Codes, den ich verlinkt habe. –

0

Ist der Familienname, den Sie an den FontFamily-Konstruktor übergeben, tatsächlich ein Familienname, der von der Schriftartdatei angezeigt wird? Wenn Sie in Ihrem Beispiel die Datei Wingding.ttf geladen haben, lautet der Name der Schriftartfamilie Wingdings, nicht bf_helvetica. Wenn die Schriftartdatei bf_helvetica.ttf ist, ist der Familienname wahrscheinlich etwas anderes als der Name der Schriftart, wie Helvetica oder Helvetica Bold.