c# - WPF 如何使文本框可滑动
问题描述
所以我有一个固定高度和宽度的文本框。我想在 TextBox 上有一个滑块或其他东西以使丢失的文本可见。缺少文本是指比文本框宽度长的文本。它不必是一个滑块,只是可以让我看到剪切文本的东西。
我试过:
<TextBox ScrollViewer.HorizontalScrollBarVisibility="Disabled"
ScrollViewer.VerticalScrollBarVisibility="Auto" />
但它对我没有任何作用。
解决方案
测试这个:
<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"
.
如果滚动条没有为您显示,可能是您的Width
andHeight
并不像您想象的那样“固定”。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 包裹起来TextBox
并ScrollViewer
正确设置大小以限制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);
}
推荐阅读
- youtube-api - 可以发送到 YT 视频 API 的 ID 列表的最大可能长度是多少?
- .htaccess - Joomla Gzip 压缩仅在主页中工作
- c# - SignalR 集线器不响应对象参数
- python - 如何从 .trace 文件中提取方法调用信息?
- javascript - 使用 Sequelize 在数据库中创建新列?
- ms-access-2007 - Access 2007 不会打开 accdb 文件,除非它被重命名
- r - 根据第一次出现更改组中的值
- javascript - 构建 Web 应用程序时如何绕过客户端的 cors 错误?
- odata - 将标头添加到有效负载中的单个调用
- csv - 使用 vbs 删除 .csv 中具有空列的行