WPF - ScrollViewer返回到开始位置

时间:2016-05-06 21:09:23

标签: c# wpf scrollviewer itemscontrol

我有一个包含单元格的表格,其中可以插入值。表是基于数据动态生成的。表大小受网格的限制,它位于网格中。如果数据太多,则会出现水平滚动条。

这是使用ScrollViewer中的ItemsControl实现的。

<ScrollViewer
    VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility="Auto">
    <ItemsControl ItemsSource="{Binding Data}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border>
                    <ItemsControl ItemsSource="{Binding Value}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.RowDefinitions>
                                        <RowDefinition SharedSizeGroup="SomeCellRowSize"/>
                                    </Grid.RowDefinitions>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition SharedSizeGroup="SomeCellRowSize"/>
                                    </Grid.ColumnDefinitions>
                                    <TextBox
                                        Text="{Binding Value.TotalTime}"
                                        HorizontalContentAlignment="Right" BorderThickness="0" Margin="1,1,0,0"/>
                                </Grid>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</ScrollViewer>

当我们向右滚动表格并选择一些单元格(TextBox)时,会出现问题。如果我们这样做,那么ScrollViewer将返回到最左边的位置。

1 个答案:

答案 0 :(得分:3)

最好在ScrollViewer内部集成ItemsPanel,而不是在其周围包裹ScrollViewer。根据我的经验,您往往会遇到更多问题。更新您的Template以取代ScrollViewer

<ItemsControl ItemsSource="{Binding Data}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
     <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Disabled">
                <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"/>
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border>
                <ItemsControl ItemsSource="{Binding Value}">
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <StackPanel/>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition SharedSizeGroup="SomeCellRowSize"/>
                                </Grid.RowDefinitions>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition SharedSizeGroup="SomeCellRowSize"/>
                                </Grid.ColumnDefinitions>
                                <TextBox
                                    Text="{Binding Value.TotalTime}"
                                    HorizontalContentAlignment="Right" BorderThickness="0" Margin="1,1,0,0"/>
                            </Grid>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </Border>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>