2010-11-07 5 views
8

Ich habe eine Menge Probleme mit Silverlight Weg, um mit Layout umzugehen. Hauptsächlich kann ich keine Möglichkeit finden, die Größe von Zeichenketten vorherzusagen, bevor sie tatsächlich gezeichnet werden. Auf dem iPhone haben wir einige sehr einfache Methoden, die es uns ermöglichen, die Größe zu bestimmen, die eine Zeichenfolge auf dem Bildschirm einnehmen wird, basierend auf der Schriftgröße, der Wortumbruchoption und der verfügbaren Breite und/oder Höhe. Aber mit Silverlight finde ich keine Möglichkeit, konsistente Ergebnisse in meiner App zu erzielen.Silverlight: Wie wird die Stringgröße vorhergesagt?

Ich verwende derzeit die ActuelHeight und ActualWidth einer TextBlock-Instanz, aber es gibt mir zufällige Ergebnisse. Zum Beispiel verwende ich den folgenden Code ...

TextBlock proto = new TextBlock(); 

proto.Width = 456; 
proto.TextWrapping = TextWrapping.Wrap; 
proto.Text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; 
double h = proto.ActualHeight; 

... h ist auf 66 Pixel eingestellt! Wie Sie selbst erraten können, ist es unmöglich, dass ein so langer Text auf ein Rechteck von 456 Pixel Breite und 66 Pixel Höhe passt. Und es wird bestätigt, wenn ich den Textblock innerhalb eines Canvas hinzufüge, seine Größe auf {456; 66} setze und die App teste: Der Text passt überhaupt nicht auf den Textblock!

Kann mir jemand erklären, wo das Problem liegt und mich auf eine konsistente (und vertrauenswürdige) Methode zur Messung von Stringgrößen hinweisen?

Vielen Dank im Voraus,

Eric.

+0

Wenn Sie das Scrollen auf auto gesetzt, können Sie den gesamten Text anzuzeigen durch Scrollen, also warum wollen Sie die Größe kennen Pixel? –

Antwort

12

Sie können die TextBlock fragen sich zu messen (ohne es noch angezeigt wird) seine Measure Methode durch den Aufruf:

textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
var width = textBlock.DesiredSize.Width; 
var height = textBlock.DesiredSize.Height; 

Natürlich kann es nicht unendlich Breite und Höhe haben, so auf Ihren Anwendungsfall abhängig Vielleicht möchten Sie Ihr Root-Element bitten, sich selbst zu messen, was wiederum alle Kinder (einschließlich der TextBlock) messen wird.

+1

Danke, aber es funktioniert nicht. Ich nehme an, der TextBlock muss angezeigt werden, damit die Messmethode funktioniert ... –

+0

@Eric MORAND ** Hinweis **: angezeigt, zum Messen, muss nicht auf dem Bildschirm sichtbar sein –

+1

Für mich nur textBlock.ActualHeight und textBlock. ActualWidth hat funktioniert. DesiredSize gab Nullen zurück. –

1

Der Textblock wird nicht die Größe, bis es tatsächlich gezeigt wird ...

Für den Rest denke ich, das eine Frage des Designs ist. In einer XAML-Umgebung sollten Sie Pixelgrößen nicht sehr oft kennen/einstellen.

+0

Wenn der TextBlock nicht in der Größe geändert wird, bis er tatsächlich angezeigt wird, wie soll ich eine Höhe für meine Listenfeldvorlagen bereitstellen? Die Dokumentation besagt, dass wir den Vorlagen eine feste Höhe geben sollten, bevor sie tatsächlich angezeigt werden, aber es scheint keine Möglichkeit zu bestehen, die Höhe einer Vorlage zu berechnen, bis sie tatsächlich angezeigt wird. –

3

Versuchen Sie nach Möglichkeit, ein Design zu erstellen, bei dem Sie die physische Größe eines Textblocks nicht kennen müssen. Verwenden Sie ein Scroll-Design und dynamische Größenanpassung, um dies nicht zu wissen.

Wenn Sie dies jedoch wirklich wissen müssen, können Sie diesen Trick vom Desktop aus versuchen (wo es nicht möglich war, MeasureText zu verwenden - in Silverlight nicht unterstützt). Fügen Sie den Textblock der Benutzeroberfläche hinzu, aber außerhalb des sichtbaren Bereichs oder hinter einem anderen Steuerelement. Sie könnten dann die tatsächlich wiedergegebene Größe erhalten.

1

Danke für Ihre Hilfe Jungs, tatsächlich meine erste Methode funktionierte! Aber ich habe vergessen, die fontSize vor dem Abrufen von ActualHeight zu setzen - und es wurde automatisch von dem Elternteil festgelegt, der dem visuellen Baum hinzugefügt wurde! Also 66 Pixel war eigentlich die richtige Höhe meines Textblocks mit der kleinen Schriftgröße, die standardmäßig vom Textblock verwendet wird. Sobald der Textblock in den visuellen Baum eingefügt wurde, war die Schriftgröße des Textblocks viel größer, was zum Ausschneiden führte.

Nochmals vielen Dank für Ihre Hilfe!

-2

Meine Lösung ist 3 oder mehr Textblocks zu verwenden:

string[] dataSeparator = new string[] { "\n" }; 
string[] data; 
data = longString.Split(dataSeparator, StringSplitOptions.None); 
TB1.Text = string.Empty; 
TB2.Text = string.Empty; 
TB3.Text = string.Empty; 
int length = data.Length/3; 
for (int i = 0; i < length; i++) 
{ 
    TB1.Text += data[i] + "\n"; 
} 
for (int i = length; i < length * 2; i++) 
{ 
    TB2.Text += data[i] + "\n"; 
} 
for (int i = length * 2; i < data.Length; i++) 
{ 
    TB3.Text += data[i] + "\n"; 
} 
Verwandte Themen