WPF - ScrollViewer returns 开始位置

WPF - ScrollViewer returns to start position

我有一个 table 单元格,可以在其中插入值。 Table 是根据数据动态生成的。 Table 大小受所在网格的限制。如果数据太多,则出现水平滚动条。

这是通过 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>

当我们向右滚动 table 和 select 某个单元格 (TextBox) 时,问题就出现了。如果我们这样做,那么 ScrollViewer 就会 return 到最左边的位置。

最好在 ItemsPanel 内部集成一个 ScrollViewer,而不是在其周围包裹一个 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>