在另一个ScrollViewer中使用ScrollViewer

4
我的 WPF 应用程序结构如下:
<Scrollviewer>
   <Grid>
       <Scrollviewer>
            <DataGrid>

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

请问有人能告诉我如何做到这一点吗?

2个回答

10

你需要在内部的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有内建的属性可用于自己的滚动条,您可以使用它们而不是将DataGrid包装在ScrollViewer中。这将滚动数据并始终保留标题可见,而不是滚动整个DataGrid。

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

但是我既不知道DataGrid的高度,也不知道可用屏幕的高度(分辨率等)。那么我该如何在没有固定大小的情况下完成这个任务呢? - TheJoeIaut
@Joelaut 请看我的编辑。你可以绑定到窗口大小,或者设置你的网格的行定义来获得相对大小。 - Rachel
这对我很有用。使用用户控件而不是窗口,将网格的高度绑定到外部滚动查看器的实际高度。完美地工作!如果控件向下移动,请注意网格的边距。 - Master Azazel

1

你可能想把DataGrid放在ScrollViewer之外。因此,你可以设置两个Grid.Rows,并让它为你分配可用的大小(默认为“相等”,或者如果你只使用两行,则为50%-50%)。因此,如果DataGrid超出了其可用大小,它将使用自己的ScrollViewer。如果下面的内容超出了大小,它将使用你手动放置的ScrollViewer。至少,这是我根据你的初始输入解决问题的方式。请随意添加代码/注释,以便我们可以找到更好的方法。

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


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