WPF中启用TextWrapping的TextBox无法显示垂直滚动条问题求助
解决WPF TextBox垂直滚动条不显示的问题
哈哈,这个场景我之前踩过坑!咱们一步步来搞定它~
为啥滚动条不出来?
你的问题其实是两个关键设置导致的:
- TextBox所在的Grid列宽度是
auto:这会让TextBox的宽度跟着文本无限拉长,TextWrapping="Wrap"根本没机会触发换行——文本一直横向走,自然不会有高度溢出,滚动条当然不会出现。 - TextBox的
VerticalAlignment="Center":就算哪天文本真的换行了,这个设置会让TextBox只保持内容本身的高度,不会填充Grid行的可用空间。一旦内容超出父容器高度,直接被截断,轮不到滚动条干活。
具体怎么改?
第一步:让文本能换行(限制宽度)
要么把TextBox所在的列从auto改成*,让它占用剩余空间,这样文本到了边界就会自动换行:
<Grid.ColumnDefinitions> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="*"/> <!-- 这里把auto换成* --> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions>
要是你想保留列宽为auto,那就给TextBox加个MaxWidth,比如MaxWidth="300",强制文本在指定宽度内换行。
第二步:让TextBox能“撑满”垂直空间
把TextBox的VerticalAlignment从Center改成Stretch,这样它会填充满Grid行的可用高度,当内容高度超过TextBox的高度时,滚动条就会自动弹出来:
<TextBox Grid.Column="1" Style="{StaticResource TextBlockStyle}" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Left" Margin="5" Text="{Binding Path=Text}" Foreground="{Binding Path=ForegroundColor}" VerticalAlignment="Stretch"> <!-- 改这里 --> </TextBox>
第三步:给父容器加高度限制
如果你的Grid或者UserControl没有设置MaxHeight或者固定高度,TextBox会一直往下延伸(因为Grid行是Auto高度),永远不会触发滚动条。所以给Grid加个MaxHeight,比如:
<Grid Height="auto" MaxHeight="200"> <!-- 加个最大高度 -->
改完后的完整代码参考
样式部分不变,Grid和TextBox调整后:
<Grid Height="auto" MaxHeight="200"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="*"/> <ColumnDefinition Width="auto"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <TextBox Grid.Column="1" Style="{StaticResource TextBlockStyle}" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Left" Margin="5" Text="{Binding Path=Text}" Foreground="{Binding Path=ForegroundColor}" VerticalAlignment="Stretch"> </TextBox> </Grid>
这样调整后,文本会乖乖换行,内容超过高度时滚动条就正常显示啦!
内容的提问来源于stack exchange,提问作者Willy




