1

在我的 Windows Store 8 Metro 风格应用程序中,我有一个滚动查看器,用于滚动堆栈面板的项目。当动态更改选择并且所选项目不在可见区域中时,我想自动滚动滚动条。

例如:这些选项卡是部分选项卡。当用户单击跳过按钮时,将跳过所选部分并选择下一个部分。当用户跳过最后一个部分时,他会跳到第一部分,但这里滚动查看器不会自动滚动到第一个选项卡,因为该用户无法在可见区域中看到所选部分。

4

3 回答 3

4

这比你想象的要容易。

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    var visual = MyRectangle.TransformToVisual(MyScrollViewer);
    var point = visual.TransformPoint(new Point(0, 0));

    // Windows 8.0
    MyScrollViewer.ScrollToVerticalOffset(point.Y);

    // Windows 8.1
    MyScrollViewer.ChangeView(null, point.Y, null);
}

使用此 XAML

<ScrollViewer x:Name="MyScrollViewer">
    <StackPanel>
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle x:Name="MyRectangle" Fill="Red" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
        <Rectangle Fill="Wheat" Height="200" Width="200" Margin="10" />
    </StackPanel>
</ScrollViewer>

祝你好运!

于 2013-11-20T20:04:34.917 回答
1

您可以改用 ListView 和 ScrollIntoView 方法。或者您可以使用 ScrollViewer 类的 ScrollToVerticalOffset 方法,但您需要项目的大小才能正确滚动。

于 2013-11-13T13:34:55.513 回答
1

根据 Jerry 的回答,下面的代码将更改 Scroll Viewer 的偏移量,以便控件位于 ScrollViewer 的视口内(如果它还没有的话)。

如果控件已经完全可见,则不会滚动滚动查看器。

var transform = control.TransformToVisual(MyScrollViewer);
var topLeft = transform.TransformPoint(new Point(0, 0));
var top = topLeft.Y;
var left = topLeft.X;
var bottom = top + control.ActualHeight;
var right = left + control.ActualWidth;

double? scrollToY = null;
if (top < 0)
{
    scrollToY = top + MyScrollViewer.VerticalOffset;
}
else if (bottom > MyScrollViewer.ViewportHeight)
{
    scrollToY = bottom + MyScrollViewer.VerticalOffset - MyScrollViewer.ViewportHeight;
}

double? scrollToX = null;
if (left < 0)
{
    scrollToX = left + MyScrollViewer.HorizontalOffset;
}
else if (right > MyScrollViewer.ViewportWidth)
{
    scrollToX = right + MyScrollViewer.HorizontalOffset - MyScrollViewer.ViewportWidth;
}

MyScrollViewer.ChangeView(scrollToX, scrollToY, null);

如果您只需要滚动一个轴,您可以删除不需要的轴的代码。

于 2014-05-05T02:54:57.323 回答