WPF TextBox 在一些字符后换行

WPF TextBox wrap a long line after a number of characters

我正在寻找解决特定任务的方法:有一个可调整大小的 window 文本框,它具有最小宽度。这里有一个小概念:

<Window ...
        SizeToContent="Width"
        ResizeMode="CanResize">
    <DockPanel>
        <Menu DockPanel.Dock="Top"><...></Menu>
        <StatusBar DockPanel.Dock="Bottom"><...></StatusBar>
        <StackPanel DockPanel.Dock="Right">
            <RadioButton .../>
            <...>
        </RadioButton>
        <TextBox MinWidth="{Binding MinWidth}"
                 TextWrapping="Wrap"
                 AcceptsReturn="True"
                 FontFamily="Consolas"
                 FontSize="{Binding FontSize}"
                 VerticalScrollBarVisibility="Visible"
                 .../>
    </DockPanel>
</Window>

我有一个两列对话框,右侧有一堆单选按钮,文本框包含所有可用内容 space。我想每行至少显示 N 个字符,所以我使用 FormattedText 来计算文本框的最小宽度以显示这些字符数并通过绑定设置最小宽度。因此,在初始化时,文本框会根据字体大小自动调整大小。到目前为止一切顺利。

我遇到的问题是文本框会在键入时自动调整大小,并且当字符串超过文本框的初始宽度时。输入行可以是数百或数千个字符长,并且不包含 space 或换行机会算法可用于换行的其他字符。

我想要的是在启用 WordWrap 选项时模仿 Windows 记事本的行为。记事本有一些宽度,如果我输入很长的一行,它会自动换行而不调整 window 的大小。 Wpf 确实会调整文本框和 window 的大小——这是我不想要的。此外,我无法通过插入隐藏字符来操作输入字符串,因此 WPF 可以按照其他类似问题中的建议中断它们。

如果我正确理解您的要求,您可以处理 window 的 LoadedSizeChanged 事件,并设置 Width 属性 TextBox相应地:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        Loaded += OnLoaded;
        SizeChanged += OnSizeChanged;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        tb.Width = double.NaN;
    }

    private void OnLoaded(object sender, RoutedEventArgs e)
    {
        tb.Width = tb.ActualWidth;
    }
}