WPF:从文本框中获取“包装”文本

| 当TextWrapping = \“ Wrap \”时,WPF中是否有一种方法可以使文本格式化,使其显示在文本框中?
<TextBox   Width=\"200\"
           TextWrapping=\"Wrap\"                 
           VerticalScrollBarVisibility=\"Auto\"
           HorizontalScrollBarVisibility=\"Auto\"  />
我已经尝试使用TextFormatter类,但是它只允许我将文本绘制到绘图环境中,在这里我只需要包含换行符的文本。     
已邀请:
这是获取带有明显换行符的完整文本的方法。 注意: 在您的项目中包括“高级文本格式示例”中的以下类: CustomTextSource 字体渲染 GenericTextProperties CustomTextSource类中提到了一些限制。但是,我相信您的要求不受这些限制的影响。 这些仅仅是示例。您可能需要根据需要修改代码。 该代码仍然使用hack(尽管是不错的)-
InputTextBox.ViewportWidth
。您可能需要测试最终输出是否完全符合要求。 请参阅:高级文本格式和高级文本格式示例 样例代码 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;
}
    
请参见Ian Griffiths的答案:从TextBlock获取显示的文本 它从
TextBlock
获取显示的文本(如显示在屏幕上一样),但我认为您也可以将其用于for5ѭ     
为此,您必须使用文本度量API编写自己的逻辑。 第1步:将文本框文本输入单词。 步骤2:然后测量每个单词的宽度并将其组合,直到行宽小于文本框的宽度。 请参阅这篇文章,其中介绍了文本测量过程。 (social.msdn.microsoft.com/forums/zh-CN/wpf/thread / ...)     
如果您想要的只是文本框的文本(完整的文本,而不仅仅是可见部分),并且要在某些文本块的同一窗口中显示为文本(带有明显的换行符),那么可以采取以下措施:
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>
),其中每个项目都代表明显的行,则需要一个复杂的解决方案。 另外,如果只需要文本框中显示的文本的可见部分,则再次需要一些复杂的解决方案。     

要回复问题请先登录注册