2009-09-10 10 views
19

È possibile mostrare/nascondere la barra di scorrimento in una casella di testo solo quando il numero di righe nella casella di testo è superiore al numero di righe visualizzate?Visualizza la barra di scorrimento nella casella di testo quando i contenuti superano i limiti C#

+0

Sfortunatamente no. È possibile impostare le barre di scorrimento su orizzontale, verticale o entrambe ma non per mostrare/nascondere quando necessario. – Anders

+0

che è solo nella casella di testo bacic - prova RichTextBox – Cullub

risposta

25

Si consiglia di utilizzare l'RichTextBox - ha quel comportamento costruito nel

+1

Ahh grazie Austin. A volte le soluzioni più ovvie sono le migliori :) – Anders

+1

Non dimenticare di aggiungere la proprietà ScrollViewer.VerticalScrollBarVisibility = "Auto" a RichTextBox – Smile4ever

7
Public Class TextBoxScrollbarPlugin 
    Private WithEvents mTarget As TextBox 

    ''' <summary> 
    ''' After the Handle is created, mTarget.IsHandleCreated always returns 
    ''' TRUE, even after HandleDestroyed is fired. 
    ''' </summary> 
    ''' <remarks></remarks> 
    Private mIsHandleCreated As Boolean = False 

    Public Sub New(item As TextBox) 
     mTarget = item 
     mIsHandleCreated = mTarget.IsHandleCreated 
    End Sub 

    Private Sub Update() 
     If Not mTarget.IsHandleCreated Then 
      Return 
     ElseIf Not mIsHandleCreated Then 
      Return 
     End If 
     Dim textBoxRect = TextRenderer.MeasureText(mTarget.Text, 
                mTarget.Font, 
                New Size(mTarget.Width, Integer.MaxValue), 
                TextFormatFlags.WordBreak + TextFormatFlags.TextBoxControl) 

     Try 
      If textBoxRect.Height > mTarget.Height Then 
       mTarget.ScrollBars = ScrollBars.Vertical 
      Else 
       mTarget.ScrollBars = ScrollBars.None 
      End If 
     Catch ex As System.ComponentModel.Win32Exception 
      'this sometimes throws a "failure to create window handle" 
      'error. 
      'This might happen if the TextBox is unvisible and/or 
      'to small to display a toolbar. 
      If mLog.IsWarnEnabled Then mLog.Warn("Update()", ex) 
     End Try 
    End Sub 

    Private Sub mTarget_HandleCreated(sender As Object, e As System.EventArgs) Handles mTarget.HandleCreated 
     mIsHandleCreated = True 
    End Sub 

    Private Sub mTarget_HandleDestroyed(sender As Object, e As System.EventArgs) Handles mTarget.HandleDestroyed 
     mIsHandleCreated = False 
    End Sub 

    Private Sub mTarget_SizeChanged(sender As Object, e As System.EventArgs) Handles mTarget.SizeChanged 
     Update() 
    End Sub 

    Private Sub mTarget_TextChanged(sender As Object, e As System.EventArgs) Handles mTarget.TextChanged 
     Update() 
    End Sub 

End Class 


Private mPlugins As New List(Of Object) 
Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    mPlugins.Add(New TextBoxScrollbarPlugin(txtBoxOne)) 
    mPlugins.Add(New TextBoxScrollbarPlugin(txtBoxTwo)) 
    mPlugins.Add(New TextBoxScrollbarPlugin(txtBoxThree)) 
End Sub 
+1

Per coloro che devono utilizzare Textbox (come ho dovuto fare poiché è un controllo personalizzato) sopra la risposta sembra funzionare bene. Supponevo che dovessi sostituire il + con OR per renderlo bit a bit e ho reso il wordbreak condizionale sul valore textbox.wordwrap. Spero possa aiutare. – Tim

4

Grazie manichino, funziona.! Ecco la versione a corto di risposta manichino in C#

chiamata questo codice alla fine del vostro SizeChanged e TextChanged gestori:

Size textBoxRect = TextRenderer.MeasureText(
    this.YourTextBox.Text, 
    this.YourTextBox.Font, 
    new Size(this.YourTextBox.Width, int.MaxValue), 
    TextFormatFlags.WordBreak | TextFormatFlags.TextBoxControl); 
try 
{ 
    this.YourTextBox.ScrollBars = textBoxRect.Height > this.YourTextBox.Height ? 
     ScrollBars.Vertical : 
     ScrollBars.None; 
} catch (System.ComponentModel.Win32Exception) 
{ 
    // this sometimes throws a "failure to create window handle" error. 
    // This might happen if the TextBox is unvisible and/or 
    // too small to display a toolbar. 
} 
0

ho avuto tnimas soluzione di lavoro in VB. Funziona abbastanza bene come scritto e non ho visto gli errori.

Private Sub TextBoxSizeChanged(sender As Object, e As EventArgs) Handles Me.SizeChanged 
    Dim textBoxRect As Size = TextRenderer.MeasureText(TextBox.Text, TextBox.Font, New Size(TextBox.Width, Integer.MaxValue), TextFormatFlags.WordBreak Or TextFormatFlags.TextBoxControl) 
    Try 
     TextBox.ScrollBar = If(textBoxRect.Height > TextBox.Height, ScrollBars.Vertical, ScrollBars.None) 
    Catch ex As Exception 
     'handle error 
    End Try 
End Sub 
Problemi correlati