【问题标题】:UWP lock scrollviewer in a positionUWP 将滚动查看器锁定在某个位置
【发布时间】:2019-05-15 13:17:21
【问题描述】:
我有一个滚动查看器想在一个动作中将它锁定在特定的滚动位置,并且必须在另一个动作中释放它。
- 我尝试启用和禁用
VerticalScrollMode 它会改变
滚动位置。
MyScrollViewer.VerticalScrollMode = ScrollMode.Disabled;
- 我也尝试过更改
VerticalScrollBarVisibility,它会将verticaloffset 置于顶部
MyScrollViewer.VerticalScrollBarVisibility = ScrollBarVisibility.Disabled;
想知道有没有办法将滚动查看器锁定在特定的偏移量?
【问题讨论】:
标签:
uwp
windows-10-universal
uwp-xaml
【解决方案1】:
我已经编写了一些代码来测试它,它似乎可以工作。也许它会让你知道如何解决你的问题。您可以简单地锁定滚动查看器,然后将其偏移到您要显示的项目,或者只是禁用“稍后”滚动,因为对我来说,它似乎并没有改变视图。如果您动态添加项目,那么 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;
}
}
【解决方案2】:
这是一种非常简单的方法,但也许你可以在它的基础上实现你想要的。
public double offset = 0.0;
在禁用滚动条之前保存偏移量:
offset = ScrView.HorizontalOffset;
ScrView.HorizontalScrollBarVisibility = ScrollBarVisibility.Disabled;
禁用后,将偏移值添加回滚动条
ScrView.ChangeView(offset, null, null, false);