Anzahl der sichtbaren Zeilen in Textbox

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Translating-IT.

    Anzahl der sichtbaren Zeilen in Textbox

    Hi,

    Wie kann ich bei einer Textbox herausfinden, wie viele Zeilen ohne Scrollleiste sichtbar sind, wenn ich nicht weiß, wie groß die Textbox eingestellt ist?

    Beispiel: nachdem der Text eingelesen ist, sind es ingesamt 4398 Zeilen. Sichbar sind nur 3. Aber wie weiß das Programm, dass nur 3 angezeigt werden. Kann ich diese "3" irgendwie berechnen oder abfragen?

    Ich benötige diese "3", um eine Zeile in der Mitte der Textbox zu zentrieren, wenn ich für eine Suchfunktion auf die Zeile mit dem Treffer zentrieren möchte. Derweil wird sie immer als 1 sichtbare Zeile in der Textbox angezeigt.

    Edit: Da die Höhe der Textbox vom Benutzer bzw. der Auflösung des Bildschirms festgelegt werden kann, ist es nicht immer 3.

    LG,
    Pascal
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    Nur zur Sicherheit: Wirklich WPF oder doch eher WinForms?

    TextBox-Höhe geteilt durch Textzeilenhöhe ergibt nahezu die Zeilenzahl.
    Die Textzeilenhöhe kannst Du mit Graphics.MeasureString rauskriegen.
    Achtung! Es gibt bei ner Multiline-TextBox größenabhängig auch halbe sichtbare Zeilen!
    Bilder
    • HalfRowTextBox.png

      505 Byte, 117×58, 176 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, wirklich WPF. ;)
    Ja, so in Etwa sieht es aus, da die 3. Zeile wirklich etwas abgeschnitten ist.

    Danke erstmal, werde mal schauen, ob ich dazu was finde …
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    ähm... wie binde ich Graphics ein. Ist das ein Addon oder über imports? Finde nämlich nicht wirklich was dazu, das mir weiterhilft.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    Geht wohl in WPF doch anders. Meine Quelle: dotnetsnippets

    VB.NET-Quellcode

    1. Public Function TextSize(RawText As String, FontFamily As FontFamily, FontSize As Double) As Size
    2. Dim FormattedText = New FormattedText(RawText, Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, FontFamily.GetTypefaces().First(), FontSize, Brushes.Black, VisualTreeHelper.GetDpi(Me).PixelsPerDip)
    3. Return New Size(FormattedText.Width, FormattedText.Height)
    4. End Function

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ok, ich hab schon gedacht, ich bin mal wieder zu deppert, das Richtige zu finden.

    Damit habe ich diesen Teil geschrieben, mit dem der Text ziemlich mittig in der Textbox angezeigt wird.

    VB.NET-Quellcode

    1. Dim ix As Integer = tb_targettext.Text.IndexOf(suchtext)
    2. tb_targettext.Select(ix, ix + 5)
    3. Dim iy As Size = TextSize("Test", tb_targettext.FontFamily, tb_targettext.FontSize)
    4. Dim iz As Double = tb_targettext.ActualHeight
    5. Dim pixelHeight As Double = iy.Height
    6. tb_targettext.ScrollToLine(tb_targettext.GetLineIndexFromCharacterIndex(tb_targettext.SelectionStart) - Math.Round((iz / pixelWidth / 2) - 0.5))


    Danke Dir sehr.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.