2015-01-30 2 views
-1

Я хочу восстановить положение прокрутки при навигации назад, я нашел a C# code и попытался преобразовать его в Visual Basic и в настоящее время дает мне много ошибок.Как восстановить положение прокрутки GridView при навигации назад 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

+1

ли переименовывать переменные к тому, что ваш есть? Вы реализовали 'FindVisualChild (...)'? Я также не вижу «Ручки» в методах событий. – TyCobb

+0

@TyCobb +1. C# и VB.net объявляют события по-разному. См. Эту статью [MSDN] (https://msdn.microsoft.com/en-us/library/edzehd2t (v = vs.110) .aspx) о повышении событий. Я предлагаю вам генерировать события, выбирая событие из раскрывающегося списка в редакторе. – djv

+0

К сожалению, я не могу получить доступ к моему gridview в виде xaml, поскольку он находится внутри шаблона данных. Как я могу реализовать 'FindVisualChild (...)' – julekgwa

ответ

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); 
} 

Чтобы Acces вашу сетку по имени, вы должны добавить имя сетки в XAML.

<GridView 
      x:Name="itemGridView" 

Надеюсь, это поможет.

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 
Смежные вопросы