为WPF网格指定ScrollViewer的宽度减去滚动条

Pet*_*ter 4 wpf grid scrollviewer width

我有一个WPF UserControl,上面有两个网格.底部网格位于ScrollViewer中.我们的想法是让第一个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>
Run Code Online (Sandbox Code Playgroud)

这实际上很好,除了顶部网格的最右边的列延伸到滚动条上,我想避免它.

以下是结果的图像:网格列和滚动条的宽度.红色表示列/单元格现在的位置,但我希望它停在蓝线处.我已经尝试过SharedSizeGroups,但这似乎让我的网格再次变小(不占用窗口的整个空间).

rpa*_*n56 7

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Name="sv">
    <Grid MinWidth="{Binding ElementName=sv, Path=ViewportWidth}" MinHeight="{Binding ElementName=sv, Path=ViewportHeight}" />
</ScrollViewer>
Run Code Online (Sandbox Code Playgroud)

问题是在ScrollViewer容器大小和网格大小之间建立正确的依赖关系.让我们只考虑宽度:上面的绑定允许ScrollViewer仅在必要时公开水平滚动条:

扩大电网(例如用分配器)的单个列不会引发其他列的大小调整(如果你绑定这会发生Width,而不是MinWidth).

使用ViewportWidth而不是ActualWidth考虑滚动条宽度,如果有的话.

试一试


Pet*_*ter 2

在这里找到了解决方案。我给了我的Grid上衣Width

Width="{Binding ElementName=BottomGrid, Path=ActualWidth}"
Run Code Online (Sandbox Code Playgroud)