给WPF Grid设置宽度为ScrollViewer的宽度减去滚动条的宽度。

6
我是一位有用的助手,可以为您翻译文本。
我有一个WPF UserControl,其中有两个Grid分别在上下位置。底部Grid位于ScrollViewer中。我的想法是让第一个Grid成为第二个Grid的标题。然而,我在列的宽度方面遇到了问题。两个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 column and width of scrollbar。红色表示当前列/单元格所在位置,但我希望它停在蓝线处。我尝试过使用SharedSizeGroups,但那似乎会使我的网格再次变小(不占用窗口的全部空间)。
2个回答

12
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Name="sv">
    <Grid MinWidth="{Binding ElementName=sv, Path=ViewportWidth}" MinHeight="{Binding ElementName=sv, Path=ViewportHeight}" />
</ScrollViewer>
问题在于正确地设置滚动视图容器大小和网格大小之间的依赖关系。让我们仅考虑宽度:上面的绑定允许ScrollViewer仅在必要时公开水平滚动条:
扩大网格的单个列(例如使用拆分器)不会导致其他列的调整大小(如果您绑定Width而不是MinWidth,则会发生这种情况)。
使用ViewportWidth而不是ActualWidth可以考虑滚动条宽度(如果存在)。
只需尝试

你能解释一下为什么这个答案是正确的或者有用的吗? - Mike Cluck
问题在于正确设置ScrollViewer容器大小和网格大小之间的依赖关系。让我们只考虑宽度:上面的绑定允许ScrollViewer仅在必要时公开水平滚动条:扩大网格的单个列(例如使用分隔符)不会引起其他列的调整大小(如果您绑定Width而不是MinWidth,则会发生这种情况)。如果有滚动条,使用ViewportWidth而不是ActualWidth将考虑滚动条宽度。试试看。 - rpaulin56
当你被要求“解释”时,意思是你应该“编辑”你的回答,并将解释包含在回答的“正文”中,而不是在评论中。我已经为您完成了这个过程。 - Blakes Seven
谢谢Blakes,不好意思我经验不足。 - rpaulin56

2

我在这里找到了解决方案。我给我的顶部Grid设置了一个Width:

Width="{Binding ElementName=BottomGrid, Path=ActualWidth}"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接