Aquí se explica cómo obtener el texto completo con saltos de línea aparentes.
Nota:
- incluyen las siguientes clases de Advanced Text Formatting Example en su proyecto:
- CustomTextSource
- FontRendering
- GenericTextProperties
- Hay algunas limitaciones que se mencionan en CustomTextSource clase. Sin embargo, creo que sus requisitos no se ven afectados por esas limitaciones.
- Estos son solo algunos ejemplos. Es posible que desee modificar el código según sus necesidades.
- El código todavía utiliza un truco (aunque decente) -
InputTextBox.ViewportWidth
. Es posible que desee probar si el resultado final es exactamente según lo desee.
Ver: Advanced Text Formatting y Advanced Text Formatting Example
Código de ejemplo
XAML:
<Window x:Class="TextFormatterForWrappedText.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Width="200"
x:Name="InputTextBox"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto" Margin="23,12,280,241" />
<TextBox x:Name="FormattedDisplayTextBox" Height="172"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="23,105,0,0" Width="438" AcceptsReturn="True"
TextWrapping="Wrap" />
<Button HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="257,12,0,0" Height="23" Content="Copy"
Name="CopyButton" Width="129" Click="CopyButton_Click" />
</Grid>
</Window>
Codebehind:
private void CopyButton_Click(object sender, RoutedEventArgs e)
{
List<string> stringList = GetTextAsStringList();
StringBuilder sb = new StringBuilder();
foreach (string s in stringList)
{
sb.Append(s);
sb.Append("\r\n");
}
Clipboard.SetData(System.Windows.DataFormats.Text, sb.ToString());
FormattedDisplayTextBox.Clear();
FormattedDisplayTextBox.Text = sb.ToString();
}
private List<string> GetTextAsStringList()
{
List<string> stringList = new List<string>();
int pos = 0;
string inputText = InputTextBox.Text;
CustomTextSource store = new CustomTextSource();
store.Text = inputText;
store.FontRendering = new FontRendering(InputTextBox.FontSize,
InputTextBox.TextAlignment,
null,
InputTextBox.Foreground,
new Typeface(InputTextBox.FontFamily,
InputTextBox.FontStyle,
InputTextBox.FontWeight,
InputTextBox.FontStretch));
using (TextFormatter formatter = TextFormatter.Create())
{
while (pos < store.Text.Length)
{
using (TextLine line = formatter.FormatLine(store,
pos,
InputTextBox.ViewportWidth,
new GenericTextParagraphProperties(
store.FontRendering),
null))
{
stringList.Add(inputText.Substring(pos, line.Length - 1));
pos += line.Length;
}
}
}
return stringList;
}
lo siento, pero no podía entender el problema stat ement. ¿Es que quieres copiar el texto de ese cuadro de texto y, al pegar en otro lugar, deseas conservar las posiciones ajustadas? – publicgk
Como texto o como imagen/visual? –
@publicgk, mi caso exacto es pasar el texto al informe activo mientras se preserva la posición envuelta así que obtuve el mismo ajuste que el que se muestra en la pantalla. Entonces lo necesito como texto. – Fbeauche