如何在导航回Visual Basic时恢复GridView的滚动位置

时间:2015-01-30 21:46:44

标签: c# vb.net gridview windows-store-apps

我想在导航回来时恢复滚动位置,我找到a C# code并试图转换为Visual Basic,目前给了我很多错误。

C#代码:

void ItemsPage_Loaded(object sender, RoutedEventArgs e)
{
   this.gridScrollViewer = FindVisualChild<ScrollViewer>(this.itemGridView);
   this.gridScrollViewer.ScrollToHorizontalOffset(App.ScrollOffset);
}

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
   App.ScrollOffset = gridScrollViewer.HorizontalOffset;
   base.OnNavigatedFrom(e);
}

我转换的VB代码:

Private Sub ItemsPage_Loaded(sender As Object, e As RoutedEventArgs)
    Me.gridScrollViewer = FindVisualChild(Of ScrollViewer)(Me.itemGridView)
    Me.gridScrollViewer.ScrollToHorizontalOffset(App.ScrollOffset)
End Sub
Protected Overrides Sub OnNavigatedFrom(e As NavigationEventArgs)
    App.ScrollOffset = gridScrollViewer.HorizontalOffset

    MyBase.OnNavigatedFrom(e)
End Sub

错误:

enter image description here

2 个答案:

答案 0 :(得分:0)

几个月前我遇到过类似的问题。你的方法:

FindVisualChild<ScrollViewer>()

你可以用这种方式实现(你可以将它重写为VB.Net,我没有太多时间重写它)。

 public static T GetVisualChild<T>(DependencyObject parent) where T : DependencyObject
        {
            T child = default(T);
            int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
            for (int i = 0; i < numVisuals; i++)
            {
                DependencyObject v = VisualTreeHelper.GetChild(parent, i);
                child = v as T;
                if (child == null)
                    child = GetVisualChild<T>(v);
                if (child != null)
                    break;
            }
            return child;
        }

然后你可以按照你写的那样调用它:

 var gridScrollViewer = (ScrollViewer)Helpers.GetVisualChild<ScrollViewer>(this.itemGridView);
 if (gridScrollViewer != null)
{
        gridScrollViewer.ChangeView(App.ScrollOffset, null, null, true);
       //this is not supported in next windows releases after Win8.1
       //Windows.UI.Xaml.Controls.ScrollViewer.ScrollToHorizontalOffset(double)' is obsolete: 'ScrollToHorizontalOffset may be altered or unavailable for releases after Windows 8.1. Instead, use ChangeView.
       // gridScrollViewer.ScrollToHorizontalOffset(App.ScrollOffset);
}

要按名称访问您的网格,您必须在xaml中为网格添加名称。

 <GridView
            x:Name="itemGridView"

我希望它会有所帮助。

答案 1 :(得分:0)

VB变体实现:

Public Shared Function GetVisualChild(Of T As DependencyObject)(ByVal parent As DependencyObject) As T
        Dim visualChild As T = Nothing
        Dim childrenCount As Int32 = VisualTreeHelper.GetChildrenCount(parent)
        Dim num As Int32 = 0
        While num < childrenCount
            Dim child As DependencyObject = VisualTreeHelper.GetChild(parent, num)
            visualChild = DirectCast((TryCast(child, T)), T)
            If (visualChild Is Nothing) Then
                visualChild = Helpers.GetVisualChild(Of T)(child)
            End If
            If (visualChild Is Nothing) Then
                num = num + 1
            Else
                Exit While
            End If
        End While
        Return visualChild
    End Function