Grid / ScrollViewer-冻结网格标题行垂直滚动,但不是水平滚动

时间:2011-11-27 00:22:05

标签: wpf xaml grid scrollviewer

我没有使用DataGrid或ListView,而是使用ScrollViewer和Grids来创建包含每个单元格列的项目包装面板的单元格。

我想要一个与datagrid或listview的标题列类似的行为,以便在垂直滚动它下面的项目时保持冻结,但让它水平滚动。

我目前有以下作为我的主窗口的根目录,除了当显示垂直滚动条时,项目的对齐关闭。

注意:

  • 标题列动态添加到后面的代码中 下面的“mainGrid”,每列的“1 *”大小,并且“冻结” 通过允许水平滚动条但垂直滚动条 禁用。
  • 然后添加禁用的内部滚动查看器 水平滚动,但允许垂直滚动内部“行” 分组“。
  • ItemsControl的ItemTemplate为其创建网格 列中的每个“行分组”。

因此,当“innerScrollViewer”显示其垂直滚动条时,项目不再与外部列标题对齐,并且由于右侧垂直滚动条,项目将向左移动。如何在显示垂直滚动条的两种情况下使用外部列标题动态排列内容?

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
        <Grid x:Name="mainGrid"
              Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ScrollViewer}}, Path=ViewportWidth}">
    <RowDefinitions>
        <RowDefinition Height="Auto" />     <!-- Contains Header columns dynamically added to be "frozen" -->
        <RowDefinition Height="*" />        <!-- "row groupings" -->
    </RowDefinitions>

            <ScrollViewer x:Name="innerScrollViewer"
                          HorizontalScrollBarVisibility="Disabled"
                          VerticalScrollBarVisibility="Auto"                          
                          Grid.Row="1"
                          Grid.ColumnSpan="{Binding Path=NumColumns}">

        <ItemsControl Name="mainWorkItemsItemsControl"
                  Width="{Binding ActualWidth, ElementName=mainGrid}"
                                  ItemsSource="{Binding MyGroups}"
                                  ItemTemplate="{StaticResource groupedTemplate}" />                    

            </ScrollViewer>
    </Grid>
</ScrollViewer>


<DataTemplate x:Key="groupedTemplate">

    <ItemsControl ItemsSource="{Binding GroupItems}">

                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <!-- Creates a grid with one row and the same number of columns as "mainGrid" above with a star sizing for each column  -->
                            <SimpleGrid Rows="Auto" 
                                        Columns="{p:PyBinding CommaDelimit($[.NumColumns]\, \'*\')}" />
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>

                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                <ItemsControl ItemsSource="{Binding Path=GroupedColumnItems}">                                    
                                    <ItemsControl.ItemTemplate>
                                        <DataTemplate>
                        <MyControl />                                              
                                        </DataTemplate>
                                    </ItemsControl.ItemTemplate>
                                </ItemsControl>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>

                    <ItemsControl.ItemContainerStyle>
                        <Style>
                            <Setter Property="Grid.Column"
                                    Value="{Binding Path=Index}" />
                        </Style>
                    </ItemsControl.ItemContainerStyle>

    </ItemsControl>

</DataTemplate>

1 个答案:

答案 0 :(得分:1)

你有三个选择。

  1. 默认情况下,对于两个滚动查看器(标题和内部)都可以看到垂直滚动条,因此当内部滚动查看器需要垂直滚动时,垂直滚动条才会启用而不需要占用更多空间。

  2. 绑定标题中每列的宽度属性,以及行中网格中的相应列。所以当行网格列的宽度发生变化时,它也会改变标题对应列的宽度。这也可以帮助您为用户提供设施,通过拖动边框来重新调整列的大小。但它需要更多代码。

  3. 使内部滚动查看器的竖条可见,并在标题上设置右边距,该边距等于垂直滚动条的宽度。