Sichtbare Zeilenanzahl eines TextBlocks

8

Wenn Sie TextWrapping auf "Wrap" setzen, kann ein WPF TextBlock mehrere Textzeilen enthalten. Gibt es einen "sauberen" Weg, um die Anzahl der Textzeilen zu erhalten? Ich überlegte, die gewünschte Höhe zu betrachten und sie durch eine geschätzte Höhe jeder Linie zu teilen. Das scheint jedoch ziemlich dreckig zu sein. Gibt es einen besseren Weg?

    
tom7 09.07.2009, 19:27
quelle

4 Antworten

8

Eine Sache von WPF, die sehr schön ist, ist, dass alle Steuerelemente sehr schön aussehen. Aus diesem Grund können wir TextBox verwenden, das über eine LineCount-Eigenschaft verfügt (Warum nicht?) eine DependencyProperty oder warum TextBlock es nicht auch hat, weiß ich nicht). Mit der TextBox können wir sie einfach neu gestalten, so dass sie sich verhält und eher wie ein TextBlock aussieht. In unserem benutzerdefinierten Stil / Template werden wir IsEnabled auf False setzen und nur ein grundlegendes Re-Templating des Steuerelements erstellen, so dass das deaktivierte Aussehen nicht mehr vorhanden ist. Wir können auch alle Eigenschaften, die wir pflegen möchten, wie Hintergrund, durch die Verwendung von TemplateBindings binden.

%Vor%

Nun, das wird dafür sorgen, dass unsere TextBox aussieht und sich wie ein Textblock verhält, aber wie erhalten wir die Zeilenanzahl?

Nun, wenn wir direkt im Code dahinter zugreifen wollen, können wir uns beim SizeChanged Event der TextBox anmelden.

%Vor%

Da ich dazu neigen muss, Eigenschaften wie diese an anderen Stellen als dem aktuellen Fenster zu verwenden und / oder MVVM zu verwenden und diesen Ansatz nicht zu verwenden, können wir einige AttachedProperties erstellen, um den Abruf zu verarbeiten und Einstellung des LineCounts. Wir werden die AttachedProperties verwenden, um dasselbe zu tun, aber jetzt können wir es mit jedem beliebigen TextBox-Objekt verwenden und über dieses TextBox-Objekt anstelle des DataContext des Fensters binden.

%Vor%

Jetzt ist es einfach, den LineCount zu finden:

%Vor%     
rmoore 09.07.2009 21:00
quelle
3
%Vor%     
mark carew 20.04.2012 01:06
quelle
1

Ich habe gesehen, dass diese Frage schon sieben Jahre alt ist, aber ich kam gerade mit einer Lösung:

Der TextBlock hat eine private Eigenschaft namens LineCount. Ich habe eine Erweiterungsmethode zum Lesen dieses Wertes erstellt:

%Vor%     
jannagy02 08.02.2017 10:27
quelle
-2

Der einfache Weg ist die LineCount-Eigenschaft. Außerdem haben Sie eine Methode namens GetLastVisibleLineIndex, mit der Sie wissen, wie viele Zeilen das Textfeld anzeigen kann (ohne Bildlaufleisten).

Wenn Sie wissen möchten, wann eine Zeile hinzugefügt wurde, können Sie beim TextChanged-Ereignis hören und nach der LineCount-Eigenschaft fragen (Sie müssen den LineCount in einer Variablen speichern, um die Vergleiche durchzuführen).

    
Guido Zanon 22.12.2009 13:48
quelle

Tags und Links