给 WPF Grid 一个 ScrollViewer 减去滚动条的宽度
Posted
技术标签:
【中文标题】给 WPF Grid 一个 ScrollViewer 减去滚动条的宽度【英文标题】:Give a WPF Grid the width of a ScrollViewer minus the scrollbar 【发布时间】:2011-01-29 10:04:37 【问题描述】:我有一个 WPF 用户控件,上面有两个网格。底部网格位于 ScrollViewer 中。这个想法是让第一个网格成为第二个网格的标题。但是,我在列的宽度方面遇到了问题。两个 Grid 都应该占据所有空间(窗口的宽度),但顶部 Grid 的宽度当然应该小一些,因为底部 Grid 的右侧有一个滚动条。
这是我得到的简化的 Xaml:
<UserControl>
<DockPanel>
<Grid DockPanel.Dock="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
</Grid>
<ScrollViewer>
<Grid>
<Grid.ColumnDefintions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefintions>
</Grid>
</ScrollViewer>
</DockPanel>
</UserControl>
这实际上渲染得很好,除了顶部 Grid 的最右列延伸到滚动条上,我想避免这种情况。!
这是结果的图像:Grid column and width of scrollbar。红色表示列/单元格现在的位置,但我希望它停在蓝线处。我已经尝试过 SharedSizeGroups,但这似乎使我的网格再次变小(不占用窗口的全部空间)。
【问题讨论】:
【参考方案1】:<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Name="sv">
<Grid MinWidth="Binding ElementName=sv, Path=ViewportWidth" MinHeight="Binding ElementName=sv, Path=ViewportHeight" />
</ScrollViewer>
问题是在 ScrollViewer 容器大小和网格大小之间建立正确的依赖关系。让我们只考虑宽度:上面的绑定允许 ScrollViewer 仅在必要时公开水平滚动条:
放大网格的单个列(例如,使用拆分器)不会引起其他列的大小调整(如果您绑定Width
而不是MinWidth
,则会发生这种情况)。
使用ViewportWidth
代替ActualWidth
会考虑滚动条宽度(如果有的话)。
试试吧
【讨论】:
您能解释一下为什么这个答案有效或有用吗? 问题是在 ScrollViewer 容器大小和网格大小之间建立正确的依赖关系。让我们只考虑宽度:上面的绑定允许 ScrollViewer 仅在必要时显示水平滚动条:放大网格的单个列(例如,使用拆分器)不会引起其他列的大小调整(如果您绑定 Width 而不是 MinWidth)。使用 ViewportWidth 而不是 ActualWidth 会考虑滚动条宽度(如果有的话)。试试吧 当您被要求“解释”时,您应该“编辑”您的回复并将解释包含在您回复的“正文”中。不在cmets中。为你做的。 谢谢布雷克斯,请原谅我的经验不足【参考方案2】:找到解决方案here。我给了我的顶部Grid
Width
:
Width="Binding ElementName=BottomGrid, Path=ActualWidth"
【讨论】:
以上是关于给 WPF Grid 一个 ScrollViewer 减去滚动条的宽度的主要内容,如果未能解决你的问题,请参考以下文章