[Metro][VB.NET][XAML] Auto scrollen naar onderen van TextBox

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil graag dat mijn meerlijnige textbox altijd de onderste inhoud toont door naar beneden te scrollen van zodra er nieuwe tekst wordt toegevoegd. Ik gebruikte hiervoor altijd:

Visual Basic .NET:
1
2
TextBox1.SelectionStart = TextBox1.TextLength
TextBox1.ScrollToCaret()


Maar de scrollToCaret() methode is niet meer beschikbaar voor Windows 8 Metro applicaties. Ik heb al uren gezocht om een alternatieve oplossing en kwam uiteindelijk uit op dit topic: MSDN: Scrolling a Textbox
Ik probeerde de laatste suggestie uit, degene waarbij je het ScrollViewer object van de textbox zijn children moet halen door middel van een VisualTreeHelper en daarop de methode ScrollToVerticalOffset() op te roepen:

Visual Basic .NET:
1
scrollToEndOfMultiLineTextbox(txtM)


Visual Basic .NET:
1
2
3
4
5
6
7
8
9
Public Sub scrollToEndOfMultiLineTextbox(ByVal textbox As TextBox)
     For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(textbox) - 1
          Dim obj As Object = VisualTreeHelper.GetChild(textbox, i)
          If TypeOf obj Is ScrollViewer Then
               CType(obj, ScrollViewer).ScrollToVerticalOffset(CType(obj, ScrollViewer).ExtentHeight)
               Exit For
          End If
     Next
End Sub


code:
1
2
3
<TextBox x:Name="txtM" ScrollViewer.VerticalScrollBarVisibility="Auto"
TextWrapping="Wrap" Grid.Row="3" Margin="0,0,36,0"
AcceptsReturn="True" IsReadOnly="True"/>


Ik probeerde dit maar het werkt niet. Na enkele debug-pogingen met breakpoints kwam ik tot de ontdekking dat txtM geen ScrollViewer 'Child' had. Het enige kind dat de textbox wel had was een Grid.

De scrollbars verschijnen wel en ik heb de ScrollViewer.VerticalScrollBarVisibility instelling van txtM op 'Auto' gezet in de xaml file.

Iemand die enig idee heeft wat er verkeerd loopt of een andere suggestie heeft om te scrollen?

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 13:55

Sebazzz

3dp

ScrollToCaret heeft nooit bestaan in WPF. Bedoel je niet ScrollToEnd op een System.Windows.Controls.TextBox in plaats van een System.Windows.Forms.TextBox (dat was waarschijnlijk de documentatie waar je naar keek).

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sebazzz schreef op maandag 03 september 2012 @ 22:41:
ScrollToCaret heeft nooit bestaan in WPF. Bedoel je niet ScrollToEnd op een System.Windows.Controls.TextBox in plaats van een System.Windows.Forms.TextBox (dat was waarschijnlijk de documentatie waar je naar keek).
WPF gebruik ik zelden. Meestal als ik iets snel ineen wil steken gebruik ik nog het oudere Windows Forms Application :-) Kwestie van snel te kunnen drag en droppen via absolute positioning. Daar bestaat de methode wel.

Het probleem is nu dat noch de ScrollToCaret(), noch de ScrollToEnd() methoden bestaan voor Windows 8 App development...

[ Voor 9% gewijzigd door Verwijderd op 03-09-2012 22:56 ]


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Ik ben niet thuis in WPF, maar werkt dit toevallig (kwam ik tegen in de comments op een forum)?
C#:
1
tbPositionCursor.Select(tbPositionCursor.Text.Length, 0);

Bron (niet in forum, maar origineel)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
edeboeck schreef op maandag 03 september 2012 @ 23:04:
Ik ben niet thuis in WPF, maar werkt dit toevallig (kwam ik tegen in de comments op een forum)?
C#:
1
tbPositionCursor.Select(tbPositionCursor.Text.Length, 0);

Bron (niet in forum, maar origineel)
De cursor verplaatst wel, maar er wordt jammer genoeg niet gescrolld naar de cursor :-(


Volgens mij is de enige mogelijkheid via het ScrollViewer object van het textbox en zijn klassenmethode: scrollToVerticalOffset(...) maar ik geraak niet aan het ScrollViewer object ervan...

[ Voor 93% gewijzigd door Verwijderd op 03-09-2012 23:31 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Waarom al die gekke trucs als textbox zelf zo'n methode heeft? Kan dit niet gewoon?
http://stackoverflow.com/...x-would-be-vertically-cen

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pedorus schreef op maandag 03 september 2012 @ 23:49:
Waarom al die gekke trucs als textbox zelf zo'n methode heeft? Kan dit niet gewoon?
http://stackoverflow.com/...x-would-be-vertically-cen
Neen, want de textbox voor Windows 8 Metro Apps heeft geen methode scrollToVerticalOffset(...)
Zie: MSDN: TextBox class

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ah, ok. Wat opvalt is dat GetFirstDescendantOfType<>() in je eerste link meer niveaus diep zoekt. Waarschijnlijk zit de ScrollViewer niet op het eerste niveau. Ik zou eigenlijk gewoon die functie daarvandaan proberen.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • boe2
  • Registratie: November 2002
  • Niet online

boe2

'-')/

een WPF listbox heeft toch ScrollIntoView?

Dan doe je simpelweg iets zoals lb.ScrollIntoView(addedItem)

*edit* ok, je gebruikt een tekstbox ipv een listbox. Is het echt 1 tekst die je voortdurend wil aanpassen? Wil je niet gewoon een lijst van items weergeven? In het geval van een messaging applicatie (logger, irc-achtig spul, stuff waarvoor je die autoscroll zou willen) is het zoveel handiger om een listbox te gebruiken. Mij lijkt het een gevalletje van verkeerde tools voor de job :)

[ Voor 53% gewijzigd door boe2 op 04-09-2012 11:35 ]

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind.' - Pratchett.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
pedorus schreef op dinsdag 04 september 2012 @ 00:38:
Ah, ok. Wat opvalt is dat GetFirstDescendantOfType<>() in je eerste link meer niveaus diep zoekt. Waarschijnlijk zit de ScrollViewer niet op het eerste niveau. Ik zou eigenlijk gewoon die functie daarvandaan proberen.
Thanks! Het ScrollViewer object is een Child van het Grid-Child van een textbox!!! Het werkt perfect nu.

Hieronder nog even de JUISTE code:
code:
1
2
3
4
5
6
7
8
9
10
11
Public Sub scrollToEndOfMultiLineTextbox(ByVal textbox As TextBox)
        Dim grid As Grid = CType(VisualTreeHelper.GetChild(textbox, 0), Grid)

        For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(grid) - 1
            Dim obj As Object = VisualTreeHelper.GetChild(grid, i)
            If TypeOf obj Is ScrollViewer Then
                CType(obj, ScrollViewer).ScrollToVerticalOffset(CType(obj, ScrollViewer).ExtentHeight)
                Exit For
            End If
        Next
    End Sub
Pagina: 1