WPF-ScrollViewer返回到起始位置

本文关键字:位置 返回 WPF-ScrollViewer | 更新日期: 2025-02-18 01:44:20

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

这是通过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将返回到最左边的位置。

WPF-ScrollViewer返回到起始位置

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>