Erhalten Sie angezeigten Text aus TextBlock
Ich habe einen einfachen TextBlock, die wie folgt definiert
<StackPanel>
<Border Width="106"
Height="25"
Margin="6"
BorderBrush="Black"
BorderThickness="1"
HorizontalAlignment="Left">
<TextBlock Name="myTextBlock"
TextTrimming="CharacterEllipsis"
Text="TextBlock: Displayed text"/>
</Border>
</StackPanel>
Welche Ausgänge wie diese
Diese wird mir, "TextBlock: den Angezeigten text"
string text = myTextBlock.Text;
Aber ist es ein Weg, um den text, der tatsächlich auf dem Bildschirm angezeigt werden?
Bedeutung "TextBlock: Display..."
Dank
InformationsquelleAutor der Frage Fredrik Hedblad | 2010-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie dies tun, indem Sie zunächst das abrufen der
Drawing
- Objekt repräsentiert das Erscheinungsbild derTextBlock
im visual tree, und dann zu Fuß, auf der Suche fürGlyphRunDrawing
Elemente - die enthalten die eigentlichen gerenderten text auf dem Bildschirm. Hier ist eine sehr grobe und bereit zur Umsetzung:Dies ist ein direkter Auszug aus einer kleinen Testumgebung, die ich gerade schrieb - die erste Methode ist ein button-click-handler nur für einfache Experimente.
Es nutzt die
VisualTreeHelper
um die gerendertenDrawing
für dieTextBlock
- das wird nur funktionieren, wenn die Sache bereits gerenderten durch die Art und Weise. Und dann dieWalkDrawingForText
- Methode wird die eigentliche Arbeit - es ist einfach durchläuft dieDrawing
Baum auf der Suche nach text.Das ist nicht gerade sehr schlau - es wird davon ausgegangen, dass die
GlyphRunDrawing
Objekte in der Reihenfolge angezeigt, Sie wollen Sie. Für dein Beispiel tut es - wir bekommen eineGlyphRunDrawing
mit dem abgeschnittenen text, gefolgt von einem zweiten, ein mit dem Ellipse-Zeichen. (Und übrigens, es ist nur ein unicode-Zeichen - codepoint 2026, und wenn dieser editor lässt mich einfügen in unicode-Zeichen, ist es "...". Es sind nicht drei getrennte Perioden.)Wenn Sie wollte, um diese robuster sind, würden Sie brauchen, um die Positionen all jener
GlyphRunDrawing
Objekte, und Sortieren Sie, um Sie zu verarbeiten, in der Reihenfolge, in der Sie erscheinen, anstatt nur in der Hoffnung, dass WPF passiert, ist, Sie zu produzieren-in dieser Reihenfolge.Aktualisiert, um hinzuzufügen:
Hier ist eine Skizze, wie ein position-aware Beispiel Aussehen könnte. Das ist zwar etwas provinziell - es wird davon ausgegangen Links-nach-rechts-text. Brauchen Sie etwas mehr Komplex für eine internationalisierte Lösung.
InformationsquelleAutor der Antwort Ian Griffiths
Nach verwurzelung rund um I-Reflektor für eine Weile, fand ich die folgenden:
die eine
Length
- Eigenschaft enthält die Anzahl der Zeichen, die NICHT angezeigt werden (sind in der ausgeblendeten/verborgenen Teil der Textzeile). Zu wissen, dass Wert ist, es ist nur eine Frage der Subtraktion, um die Zeichen, die angezeigt WERDEN.Diese Eigenschaft ist nicht direkt zugänglich von der TextBlock-Objekt. Wie es aussieht ist es Teil der code, der verwendet wird, die von WPF Lackieren der text auf dem Bildschirm.
Könnte es am Ende durchaus eine Menge Aprilscherze eigentlich der Wert dieser Eigenschaft für die text-Zeile im TextBlock.
InformationsquelleAutor der Antwort Stewbob
Gut, es ist ein bisschen eine konkrete Anfrage, so bin ich nicht sicher, es ist eine fertige Funktion in den Rahmen, um es zu tun. Was ich tun würde, ist die Berechnung der logischen Breite der einzelnen Zeichen, teilen Sie die ActualWidth der TextBlock, indem Sie diesen Wert, und da haben Sie die Anzahl der Zeichen vom Anfang der Zeichenfolge, die sichtbar sind. Das ist natürlich vorausgesetzt, dass die Beschneidung erst ab der rechten Seite.
InformationsquelleAutor der Antwort Moonshield
Wenn Sie müssen den text für einen Effekt könnte es dann genug sein mit dem Bild des gerenderten Textes?
Wenn ja, könnten Sie ein VisualBrush-oder-System.Windows.Media.Imaging.RenderTargetBitmap
InformationsquelleAutor der Antwort Rune Andersen
Auch ich abgebildet .Net framework mit den folgenden xaml-Code:
wenn Sie entfernen
TextOptions.TextFormattingMode="Display"
TextOptions.TextRenderingMode="Auto"
oder entfernen
xml:lang="nl-nl"
funktioniert ok
InformationsquelleAutor der Antwort Toader Ioan