首页 > 解决方案 > WPF 如何使文本框可滑动

问题描述

所以我有一个固定高度和宽度的文本框。我想在 TextBox 上有一个滑块或其他东西以使丢失的文本可见。缺少文本是指比文本框宽度长的文本。它不必是一个滑块,只是可以让我看到剪切文本的东西。

我试过:

<TextBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ScrollViewer.VerticalScrollBarVisibility="Auto" />

但它对我没有任何作用。

标签: c#wpf

解决方案


测试这个:

<TextBox ScrollViewer.VerticalScrollBarVisibility="Auto" 
        ScrollViewer.HorizontalScrollBarVisibility="Disabled"
        Width="300"
        Height="200"
        TextWrapping="Wrap"
        AcceptsReturn="True"
        FontSize="22pt"
        Text="Some loooooooooong text. Some loooooooooong text. Some long text. Some long text. Some long text. Some long text. Some long text. Some long text. "
        />

这里的关键是设置TextWrapping="Wrap"。此外,如果您希望能够使用 ENTER 键创建一个新行,请设置AcceptsReturn="True".

如果滚动条没有为您显示,可能是您的WidthandHeight并不像您想象的那样“固定”。ScrollViewer需要以某种方式限制大小。确保您TextBox正确放置在其容器中。例如,您可以临时设置它BorderThickness="5"并查看它是否没有在任何地方被剪裁(如果您有任何HorizontalAlignment/VerticalAlignment 以外的地方可能就是这种情况Stretch)。


编辑:

正如我所提到的,对于滚动 a TextBox,一切都取决于TextWrapping属性的值。

对于 a TextBox,开箱即用的水平滚动仅在文本未换行时才有意义(这意味着只有一条很长的行):

    <TextBox ScrollViewer.VerticalScrollBarVisibility="Disabled" 
        ScrollViewer.HorizontalScrollBarVisibility="Auto"
        Width="300"
        Height="200"
        TextWrapping="NoWrap"
        FontSize="22pt"
        Text="Some loooooooooong text. Some loooooooooong text. Some long text. Some long text. Some long text. Some long text. Some long text. Some long text. "
        />

如果您想要多行文本来水平滚动它,您必须明确地将 a 包裹起来TextBoxScrollViewer正确设置大小以限制ScrollViewer的内容:

<ScrollViewer 
        Width="200"
        VerticalScrollBarVisibility="Auto" 
        HorizontalScrollBarVisibility="Auto">

        <TextBox Name="txb1"
            Width="500"
            VerticalAlignment="Stretch"
            TextWrapping="Wrap"
            AcceptsReturn="True"
            FontSize="22pt"
            Text="Some loooooooooong text. Some loooooooooong text. Some long text. Some long text. Some long text. Some long text. Some long text. Some long text. "
        />
    </ScrollViewer>

我想如果你想以某种方式“自动调整”宽度TextBox,你需要在文本变化时计算它。一种方法可以做到这一点(可能有更好的解决方案):

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
        txb1.Width = txb1.Text.Split('\n').Max(a =>a.Length) * approximatedCharWidth;
    }

approximatedCharWidth我用过的地方:

approximatedCharWidth = MeasureString(txb1, "lext").Width/4.0;
private Size MeasureString(TextBox textBlock, string candidate)
    {
        var formattedText = new FormattedText(
            candidate,
            CultureInfo.CurrentCulture,
            FlowDirection.LeftToRight,
            new Typeface(textBlock.FontFamily, textBlock.FontStyle, textBlock.FontWeight, textBlock.FontStretch),
            textBlock.FontSize,
            Brushes.Black,
            new NumberSubstitution(),
            1);

        return new Size(formattedText.Width, formattedText.Height);
}

推荐阅读