Wpf 在另一个ScrollViewer中使用ScrollViewer

Wpf 在另一个ScrollViewer中使用ScrollViewer,wpf,grid,scrollviewer,Wpf,Grid,Scrollviewer,我的wpf应用程序的结构如下所示: <Scrollviewer> <Grid> <Scrollviewer> <DataGrid> 我的目标是,如果DataGrid超过屏幕的高度,就使用它自己的Scrollviewer。目前只使用外部ScrollViewer,因此我必须滚动整个网格 有人能告诉我怎么做吗?您需要在内部ScrollViewer上设置一个高度,否则它会根据内容大小拉伸到所需的长度 <

我的wpf应用程序的结构如下所示:

<Scrollviewer>
   <Grid>
       <Scrollviewer>
            <DataGrid>

我的目标是,如果DataGrid超过屏幕的高度,就使用它自己的Scrollviewer。目前只使用外部ScrollViewer,因此我必须滚动整个网格


有人能告诉我怎么做吗?

您需要在内部ScrollViewer上设置一个高度,否则它会根据内容大小拉伸到所需的长度

<Window x:Name="RootWindow">
    <ScrollViewer>
        <Grid Height="{Binding ElementName=RootWindow, Path=ActualHeight}">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="2*" />
            </Grid.RowDefinitions>

            <ScrollViewer Grid.Row="1">
                <DataGrid />
            </ScrollViewer>
        </Grid>
    </ScrollViewer>
</Window>

此外,DataGrid为自己的滚动条提供了内置属性,您可以使用这些属性来代替在ScrollViewer中包装DataGrid。这将滚动数据并始终保持标题可见,而不是滚动整个数据网格

<DataGrid HorizontalScrollBarVisibility="Auto" 
          VerticalScrollBarVisibility="Auto" />

您可能希望将DataGrid放置在Scrollviewer之外。因此,您可以设置两个Grid.Rows,并将其作为可用大小的一部分(默认值为“equal”,或者如果仅使用两行,则为50%-50%)。因此,如果DataGrid超过其可用大小,它将使用自己的ScrollViewer。如果以下内容超出大小,它将使用手动放置的ScrollViewer。至少,根据你最初的输入,我会这样解决它。请随意添加代码/注释,以便我们可以找到更好的方法


如果您将两个ScrollViewer和一个datagrid放在彼此内部,您将被迫开始传递具体的高度或宽度值,如果您想要这种细粒度的控制。

但我不知道datagrid的高度,也不知道可用的屏幕高度(分辨率等)。那么,没有固定的大小,我怎样才能做到这一点呢?@Joelaut请查看我的编辑。您可以绑定到窗口大小,也可以设置网格的行定义以获得相对大小。这对我很有用。有一个用户控件,而不是窗口,我将网格高度绑定到实际高度。完美无瑕!如果控件向下移动,请注意网格边距