WPF中ScrollViewer内StackPanel最后一个按钮无法完整显示如何解决
WPF ScrollViewer嵌套StackPanel滚动时最后一个控件显示不全问题
问题背景
我是WPF开发新手,正在制作我的第一个正式项目——笔记应用。原本计划将每个笔记关联对应按钮,放在StackPanel中实现美观的排布效果。在StackPanel内动态生成按钮时,向下滚动按钮列表,最后一个按钮始终无法完整显示。
最初判断是Margin属性设置问题,尝试调整Margin、将Height与Width属性设为Auto均未解决问题。当前StackPanel嵌套在ScrollViewer中,将滚动条拖动到最底部时,仅能看到最后一个按钮的一半,诉求是实现最后一个按钮的完整显示。
现有代码
ScrollViewer与StackPanel的XAML代码
<ScrollViewer VerticalScrollBarVisibility="Auto" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" Grid.RowSpan="3" Margin="50 -50 50 5" > <StackPanel x:Name="ButtonPanel"/> </ScrollViewer>
动态生成控件的C#代码
dynamicTextBox.Add(SearchNotes); dynamicTextBox[index_of_buttons] = new TextBox(); Grid.SetRow(dynamicTextBox[index_of_buttons], 1); Grid.SetColumn(dynamicTextBox[index_of_buttons], 0); this.ButtonPanel.Children.Add(dynamicTextBox[index_of_buttons]); dynamicTextBox[index_of_buttons].IsReadOnly = false; dynamicTextBox[index_of_buttons].Text = "";
说明:
dynamicTextBox是应用了控件模板的TextBox类型List,排查该问题不需要查看模板代码。
问题效果

问题原因与修复方案
问题根源出在ScrollViewer的Margin属性设置上:
WPF中Margin属性的四个值顺序为左、上、右、下,你当前设置的Margin="50 -50 50 5"给上方向设了-50的负边距,相当于把整个ScrollViewer向上偏移了50像素,控件顶部超出父容器可视区域的同时,底部会少掉对应50像素的显示空间,滚动到底部时最后一个控件自然会被截断显示不全。
修复操作:
- 移除ScrollViewer上的负上Margin,调整为合理的正间距即可,比如修改为
Margin="50 0 50 5",如果需要顶部留出空白就给上Margin设为对应的正数值,不要用负边距把控件偏移到父容器可视范围外。 - 额外冗余代码提示:你对添加到StackPanel中的TextBox调用
Grid.SetRow()、Grid.SetColumn()是无效代码,这两个是Grid容器的附加属性,只有控件直接放在Grid子级时才会生效,放在StackPanel中设置这两个值不会产生任何效果,可以直接删除这两行。
内容的提问来源于stack exchange,提问作者NoName
相关产品推荐
相关产品推荐

