WPF中TextBlock导致Grid列宽异常,如何实现列1与列2等宽?
问题排查与解决方案
首先,我注意到你的代码里有一个明显的拼写错误,这很可能是导致布局异常的直接原因:
在InsertContent方法的最后一段,你写了:
cotent.HorizontalAlignment = HorizontalAlignment.Left;
这里的cotent应该是content——这个拼写错误会导致运行时抛出异常,中断布局逻辑,进而引发控件拉伸等意外行为。先把这个错误修复,再看后续的布局问题。
接下来,关于你希望列1和列2始终保持相同宽度的需求,以及添加TextBlock后控件向右拉伸的问题,主要和容器的布局约束有关:
你的控件结构是ScrollViewer -> StackPanel -> PresenterItem(Border) -> Grid,这里有两个关键点需要调整:
- 限制StackPanel的宽度
StackPanel默认会根据子元素的需求无限扩展宽度(垂直方向的StackPanel,宽度由最宽的子元素决定),而ScrollViewer默认允许水平滚动,这就会导致你的Grid随着内容拉伸,Star列的等宽逻辑失效。
解决方法是给ScrollViewer禁用水平滚动,强制StackPanel的宽度适配ScrollViewer的可视区域:
<!-- 调整你的XAML结构,添加HorizontalScrollBarVisibility设置 --> <ScrollViewer HorizontalScrollBarVisibility="Disabled"> <StackPanel> <!-- 动态添加的PresenterItem会在这里渲染 --> </StackPanel> </ScrollViewer>
这样StackPanel的宽度会被限制在ScrollViewer的范围内,PresenterItem作为StackPanel的子元素,默认HorizontalAlignment="Stretch"会占满StackPanel宽度,Grid的Star列就能正确按比例分配宽度,保持列1和列2等宽。
- 确认Grid的列设置正确性
你已经给列1和列2设置了Width = new GridLength(2, GridUnitType.Star),这个设置是正确的——只要Grid的宽度被父容器固定约束,这两列就会始终保持相同宽度。修复拼写错误并添加ScrollViewer的约束后,这个逻辑就能正常生效。
最后,修复后的InsertContent方法里的内容部分代码应该是:
// Content TextBlock content = CreateTextBlock(2, 1, 2); content.Inlines.Add(new Run($"{submission.Content}")); content.HorizontalAlignment = HorizontalAlignment.Left; content.VerticalAlignment = VerticalAlignment.Top; content.Margin = new Thickness(5, 0, 0, 0); content.TextWrapping = TextWrapping.WrapWithOverflow; content.FontSize = 13.5;
完成以上两步修改后,你的控件应该就能正常显示,且列1和列2保持等宽,不会出现向右拉伸的问题了。
内容的提问来源于stack exchange,提问作者Marcin
相关产品推荐
相关产品推荐

