2016-11-01 2 views
0
<GridView 
    Name="Slider" 
    ItemsSource="{Binding Node.Contents}" 
    Loaded="SliderLoaded" 
    .../> 

ViewModel 초기화는 비동기이며 그 곳에서 바인딩에 참조 된 Node 속성을 설정합니다.XAML (UWP) GridView가 완전히로드되는시기는 언제입니까?

<Setter Property="ItemsPanel"> 
    <Setter.Value> 
     <ItemsPanelTemplate> 
      <ItemsStackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </Setter.Value> 
</Setter> 
뒤에 코드에

:

는 항목 패널의 스타일입니다

private async void SliderLoaded(object sender, RoutedEventArgs e) 
{ 
    // I get a null reference exception trying to access the GridView scrollViewer here 

    await Task.Delay(150); // [hack] wait a bit for the view tree and binding to be ready 

    // the scrollViewer is accessible after the delay 
} 

그리고이 나는 ScrollViewer에 액세스하는 방법 :

public static ScrollViewer GetScrollViewer(this DependencyObject element) 
{ 
    if (element is ScrollViewer) 
    { 
     return (ScrollViewer)element; 
    } 

    for (var i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) 
    { 
     var child = VisualTreeHelper.GetChild(element, i); 

     var result = GetScrollViewer(child); 
     if (result != null) 
      return result; 
    } 

    return null; 
} 

읽기 문서 및 기타 그래서 모든 하위 뷰와 바인딩이 생성되는 장소와 같은 "로드 된"이벤트 처리기 솔기가 응답합니다. d와 사용 가능하지만 댓글에서 볼 수 있듯이 작동하지 않습니다.

동일한 결과가있는 DataContextChanged 이벤트 처리기도 시도했습니다.

그리드 scrollViewer 및 항목을 제 위치에 100 % 확신 할 수있는 방법 또는시기는 언제입니까?

+0

"GridView scrollViewer에 액세스하려고합니다"라는 의미는 무엇입니까? 그게 뭘 사용 했지? –

+0

중요합니까? 코드가 작동합니다 (질문에 포함 시켰습니다). – xleon

답변

1

GridView의 ScrollViewer를 가져 오는 방법을 지정하지 않았습니다. 당신이 VisualTreeHelper을 사용하고 있다고 가정하고 있습니까?

이 나를 위해 작동합니다 혼란에 대한

<GridView Loaded="GridView_Loaded"/> 
private void GridView_Loaded(object sender, RoutedEventArgs e) 
{ 
    var scrollViewer = ((UIElement)sender) 
          .ChildrenBreadthFirst() 
          .OfType<ScrollViewer>() 
          .First(); 
} 
public static class Extensions 
{ 
    public static IEnumerable<UIElement> ChildrenBreadthFirst(this UIElement element) 
    { 
     var queue = new Queue<UIElement>(); 
     queue.Enqueue(element); 

     while (queue.Count > 0) 
     { 
      element = queue.Dequeue(); 
      var count = VisualTreeHelper.GetChildrenCount(element); 

      for (var i = 0; i < count; i++) 
      { 
       var child = (UIElement)VisualTreeHelper.GetChild(element, i); 
       yield return child; 
       queue.Enqueue(child); 
      } 
     } 
    } 
} 
0

죄송합니다. 내 코드가 작동하고 있었고 깨닫지 못했습니다. 문제는 ScrollView 및 기타 항목을 가져 와서 항목을 찾고 애니메이션 스크롤을하는 함수가 있다는 것입니다. ScrollView가 있었지만 TaskCompletionSource에 싸여있는 코드의 다른 부분은 자동으로 실패했습니다.

어쨌든,이 모든 것의 요점은 프로그래밍 방식의 GridView를 스크롤 할 수 있었고, 나는 ItemsPanelTemplateStackPanel으로 ItemsStackPanel를 교체 할 때 모든 문제가 사라졌다.

불편을 끼쳐 드려 죄송합니다.

관련 문제