给 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 减去滚动条的宽度的主要内容,如果未能解决你的问题,请参考以下文章

WPF中Grid实现网格,表格样式通用类(转)

wpf 动态添加滚动条

Wpf动画如何移动grid?to属性好像只能为数字,但Grid定位有四个数据,并且执行动画方法参数

TextView不用ScrollViewe也可以滚动的方法

wpf grid百分比设置以及布局思想

C# wpf怎么在grid添加自定义控件时显示滚动条