当TextWrapping =“Wrap”时,WPF中是否有一种方法可以将文本格式化为文本框中显示的格式?
<TextBox Width="200"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto" />
我曾尝试使用TextFormatter类,但它允许我将文本绘制到绘图上下文中,其中我只需要包含换行符的文本。
答案 0 :(得分:3)
以下是如何获得具有明显换行符的完整文本。
注意:
InputTextBox.ViewportWidth
。您可能希望根据需要测试最终输出是否完全。请参阅:Advanced Text Formatting和Advanced Text Formatting Example
示例代码
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>
代码隐藏:
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;
}
答案 1 :(得分:2)
请参阅 Ian Griffiths 对这个问题的回答:Get Displayed Text from TextBlock
它从TextBlock
获取显示的文本(因为它显示在屏幕上),但我认为你应该能够将它用于TextBox
答案 2 :(得分:1)
为此,您必须使用文本测量API编写自己的逻辑。
第1步:将文本框文本刷新为单词。
第2步:然后测量每个字宽并合并它们,直到线宽小于文本框宽度。
请参阅此文章,了解文本测量过程。 (social.msdn.microsoft.com/forums/en-US/wpf/thread/...)
答案 3 :(得分:1)
如果您想要的只是文本框的文本(完整文本而不仅仅是可见部分),要在某个文本块的同一窗口中显示为文本(带有明显的换行符),快速入侵可能是:
FormattedText ft = new FormattedText(textBox1.Text,
System.Globalization.CultureInfo.CurrentCulture,
textBox1.FlowDirection,
new Typeface(textBox1.FontFamily,
textBox1.FontStyle,
textBox1.FontWeight,
textBox1.FontStretch),
textBox1.FontSize,
textBox1.Foreground);
ft.TextAlignment = textBox1.TextAlignment;
ft.Trimming = TextTrimming.None;
ft.MaxTextWidth = textBox1.ViewportWidth;
textBlock1.Width = textBox1.ViewportWidth;
textBlock1.Height = ft.Height;
textBlock1.TextAlignment = textBox1.TextAlignment;
textBlock1.TextWrapping = textBox1.TextWrapping;
textBlock1.Text = textBox1.Text;
如果在其他地方需要,您可以将值带到那个地方并在那里的文本块上使用它们。
如果您需要完整的文本(带有明显的换行符)作为字符串列表(例如List<string>
),其中每个项目代表明显的行,您将需要一个复杂的解决方案。
另外,如果您只需要文本框中显示的文本的可见部分,则需要一些复杂的解决方案。