2010-02-09 7 views
5

In normalen C# ist es einfach, mit der Grpahics.DrawString() -Methode auf eine Bitmap zu zeichnen. Silverlight scheint Bitmap-Objekte entfernt zu haben und Graphics ist nicht mehr verfügbar. Also ... Wie soll ich eine Bitmap manipulieren/erstellen, wenn ich Silverlight verwende? Wenn es hilft, verwende ich Silverlight 3.Wie zeichnest du eine Zeichenkette zu einer Bitmap in Silverlight?

Lassen Sie mich Ihnen sagen, was ich tue. Ich bekomme eine Vorlage, im Grunde ein vorgerendertes Bild. Der Benutzer kann dann aus mehreren Bildern auswählen und den gewünschten Text eingeben. Ich rendere es dann zum Bild, justiere die Größe usw. innerhalb der Grenzen und zentriere es in dem vordefinierten Bereich des Bildes. Wenn ich die Größe (wie in der MeasureString-Methode) berechnen und dann die Zeichenfolge (wie in der Graphics.DrawString-Methode) zeichnen kann, wäre das in Ordnung. Die wirkliche Frage, egal warum ich das will, ist, kann es getan werden?

+2

Es gibt immer eine Befürchtung seitens derjenigen, die Ratschläge geben, dass dies für das vorliegende Problem angemessen ist. Nicht zu wissen, warum irgendjemand etwas tun möchte (besonders etwas, was an der Oberfläche unklug erscheint) macht uns unwohl.Mit dem Grund __why__ kann jemand eine weitere Lösung anbieten, die Sie möglicherweise noch nicht berücksichtigt haben. – AnthonyWJones

Antwort

3

Die Frage ist: Warum willst du? Warum nicht einfach eine TextBlock verwenden?

Wenn Sie versuchen, ein Bild dynamisch zu generieren, verwenden Sie standardmäßige Silverlight/WPF-Steuerelemente (einschließlich TextBlock) und render diese an eine WritableBitmap.

Edit:

Ok, haben Sie aktualisiert und erweitert, was mich mehr gibt auf zu gehen. Leider wirst du die Antwort nicht mögen. Denken Sie zunächst daran, dass Silverlight und WPF im Allgemeinen vektorbasiert sind und als solche verwendet werden sollen. Obwohl Canvas Pseudopixel-Manipulationen ermöglicht, können Sie nicht annähernd so pixelgenau sein wie die GDI der alten Schule. Dies ist ein Faktor Ihres Mediums. Wenn Sie die Dinge unbedingt so messen müssen, wie Sie sie messen möchten, sollten Sie Ihre Bilder auf einem Remote-Server erstellen und an Ihre Silverlight-App übertragen.

Sie können die Größe des über einen TextBlock gerenderten Texts mithilfe der ActualWidth- und ActualHeight-Eigenschaften auf dem Bildschirm berechnen. Aber es funktioniert nur auf einem bereits gerenderten Steuerelement. So etwas wie MeasureString ist in Silverlight einfach nicht verfügbar. Basierend auf Ihrer Beschreibung Ihrer App könnte eine Benutzerinteraktion das erreichen, was Sie möchten. Der Benutzer wählt das Bild aus, gibt den Text ein und es wird eine Vorschau angezeigt. Der Benutzer kann dann die Breite und Höhe der verschiedenen Textbereiche anpassen, bis er zufrieden ist. An diesem Punkt können Sie einen Schnappschuss mit der oben beschriebenen Rendermethode machen.

+0

OK ... Also, wie würde ich das dann machen? Lassen Sie mich Ihnen sagen, was ich tue. Mir wird eine Vorlage gegeben, im Grunde ein vorgerendertes Bild. Der Benutzer kann dann aus mehreren Bildern auswählen und den gewünschten Text eingeben. Ich rendere es dann zum Bild, justiere die Größe usw. innerhalb der Grenzen und zentriere es in dem vordefinierten Bereich des Bildes. Wenn ich die Größe berechnen kann (wie in der MeasureString-Methode) und dann die angegebene Zeichenkette (wie in der Graphics.DrawString-Methode) mithilfe Ihrer Technik zeichnen kann, wäre das in Ordnung. Die eigentliche Frage, egal, warum ich das tun möchte, ist, kann es getan werden? – Spenduku

+0

@Spencer: Sie sollten diesen Kommentar in Ihre Frage verschieben. –

+0

Die Antwort ist nicht das, was ich mir erhofft habe, aber es scheint der einzige machbare Weg zu sein. So danke! :) – Spenduku

3

Das Folgende mag funktionieren, es ist ein bisschen nebulös, weil ich selbst noch nicht ausprobiert habe.

Das Objekt, nach dem Sie suchen, ist WritableBitmap.

Sie erstellen eine visuelle Struktur, zum Beispiel erstellen Sie selbst eine Grid oder Canvas (Sie fügen dies nicht der Benutzeroberfläche hinzu). Fügen Sie das ausgewählte Bild und einen TextBlock hinzu, der nach Ihren Wünschen positioniert und skaliert wird.

Erstellen Sie eine neue WritableBitmap entweder einer bestimmten Größe oder verwenden Sie das ausgewählte Bild, um es zu initialisieren.

Verwenden Sie die WritableBitmapRender Methode, die den obigen Stamm Grid oder Canvas zu ihm führt.

Jetzt haben Sie eine Bitmap, die Sie verwenden können, um zu tun, was auch immer Sie benötigten, dass alle diese Hoop-Springen in erster Linie erforderlich.