UWP 将滚动查看器锁定在某个位置

UWP lock scrollviewer in a position

我有一个滚动查看器想在一个动作中将其锁定在特定的滚动位置,并且必须在另一个动作中释放它。

  1. 我试过启用和禁用 VerticalScrollMode 它改变了 滚动位置。

MyScrollViewer.VerticalScrollMode = ScrollMode.Disabled;

  1. 我也尝试过更改 VerticalScrollBarVisibility 它将垂直偏移设置到顶部

MyScrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;

想知道有没有办法将滚动查看器锁定在特定的偏移量?

我写了一些代码来测试它,它似乎可以工作。也许它会给你一个想法如何解决你的问题。您可以简单地锁定滚动查看器,然后将其偏移到您要显示的项目或简单地禁用滚动 'later',因为对我来说,它似乎不会改变视图。如果您动态添加项目,那么 VisualTreeView 可能会进一步帮助您。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" MinWidth="200" />
    </Grid.ColumnDefinitions>
    <ScrollViewer x:Name="SomeScrollViewer">
        <StackPanel x:Name="LotsOfItems" HorizontalAlignment="Center" />
    </ScrollViewer>
    <StackPanel Grid.Column="1">
        <Button
            x:Name="OffsetButton"
            Click="OffsetButton_Click"
            Content="Offset" />
        <Button
            x:Name="LockButton"
            Click="LockButton_Click"
            Content="Lock/Unlock" />
    </StackPanel>
</Grid>

代码隐藏

    public MainPage()
    {
        this.InitializeComponent();
        for (int i = 0; i < 50; i++)
        {
            LotsOfItems.Children.Add(new TextBlock() { Text = "Some item in a scrollviewer: " + i.ToString() });
        }

    }

    private void OffsetButton_Click(object sender, RoutedEventArgs e)
    {
        SomeScrollViewer.ChangeView(0, 250, 1f);
    }

    private void LockButton_Click(object sender, RoutedEventArgs e)
    {
        if (SomeScrollViewer.VerticalScrollMode == ScrollMode.Disabled)
        {
            SomeScrollViewer.VerticalScrollMode = ScrollMode.Enabled;
            SomeScrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;

        }
        else
        {
            SomeScrollViewer.VerticalScrollMode = ScrollMode.Disabled;
            SomeScrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Hidden;
        }

    }

这是一种非常简单的方法,但也许您可以在此基础上进一步实现您想要的。

public double offset = 0.0;

在禁用滚动条之前保存偏移量:

offset = ScrView.HorizontalOffset;
ScrView.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;

禁用后,将偏移值添加回滚动条

ScrView.ChangeView(offset, null, null, false);