¿Cómo hacer WordWrapping a un String?.
Teniendo un string, y una longitud máxima en pixels, esta función/extensión de método nos servirá para hacerle wordwrap a dicho string, y así ajustar las palabrás al límite de longitud especificado.
Ejemplo de uso:
Teniendo un string, y una longitud máxima en pixels, esta función/extensión de método nos servirá para hacerle wordwrap a dicho string, y así ajustar las palabrás al límite de longitud especificado.
Código (vbnet) [Seleccionar]
''' ----------------------------------------------------------------------------------------------------
''' <summary>
''' Wraps words of the source <see cref="String"/> to the
''' beginning of the next line when necessary to fit the specified pixel width.
''' </summary>
''' ----------------------------------------------------------------------------------------------------
''' <remarks>
''' Credits to @undejavue solution: <see href="https://stackoverflow.com/a/36803501/1248295"/>
''' </remarks>
''' ----------------------------------------------------------------------------------------------------
''' <param name="sender">
''' The source <see cref="String"/>.
''' </param>
'''
''' <param name="maxWidth">
''' The maximum width, in pixels.
''' </param>
'''
''' <param name="font">
''' The text font.
''' </param>
''' ----------------------------------------------------------------------------------------------------
''' <returns>
''' The resulting string.
''' </returns>
''' ----------------------------------------------------------------------------------------------------
<DebuggerStepThrough>
<Extension>
<EditorBrowsable(EditorBrowsableState.Always)>
Public Function WordWrap(ByVal sender As String, ByVal maxWidth As Integer, ByVal font As Font) As String
Dim sourceLines() As String = sender.Split({" "c}, StringSplitOptions.None)
Dim wrappedString As New Global.System.Text.StringBuilder()
Dim actualLine As New Global.System.Text.StringBuilder()
Dim actualWidth As Double = 0
For Each line As String In sourceLines
Dim lineWidth As Integer = TextRenderer.MeasureText(line & " ", font).Width
actualWidth += lineWidth
If (actualWidth > maxWidth) Then
wrappedString.AppendLine(actualLine.ToString())
actualLine.Clear()
actualWidth = lineWidth
End If
actualLine.Append(line & " ")
Next line
If (actualLine.Length > 0) Then
wrappedString.AppendLine(actualLine.ToString())
End If
Return wrappedString.ToString()
End Function
Ejemplo de uso:
Código (vbnet) [Seleccionar]
Dim tb As New TextBox With {
.Multiline = True,
.ScrollBars = ScrollBars.Both,
.WordWrap = False,
.Size = New Drawing.Size(width:=250, height:=200)
}
Dim text As String = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
Dim wordWrappedText As String = text.WordWrap(tb.Width, tb.Font)
Me.Controls.Add(tb)
tb.Text = wordWrappedText
Console.WriteLine(wordWrappedText)