2015-05-11 24 views
5

Mam Pivot z kilkoma PivotItems, z których jeden zawiera płótno, które umieszcza swoje elementy w dynamicznych lokalizacjach (w zależności od danych). Dostaję dane i mogę umieścić elementy w ich miejscu, zanim użytkownik będzie mógł wybrać ten przedmiot (nie jest to pierwsza oś). Jednak tylko wtedy, gdy wybiorę PivotItem, płótno samo się renderuje, więc widzisz, jak migocze, zanim zostanie pokazane tak, jak powinno.Wymuszenie elementu przestawnego do wstępnego wczytania przed jego wyświetleniem

Czy istnieje sposób na wymuszenie renderowania obszaru roboczego przed jego wyświetleniem, więc wszystko jest przygotowane do czasu, kiedy użytkownik je zobaczy?

Mój kod wygląda mniej więcej tak:

W page.xaml.cs:

private async void GameCenterView_OnDataContextChanged(object sender, EventArgs e) 
{ 
    // Load data... 

    // Handle other pivots 

    // This is the problem pivot 
    if (ViewModel.CurrentGame.SportTypeId == 1) 
    { 
     _hasLineups = ViewModel.CurrentGame.HasLineups.GetValueOrDefault(); 
     HasFieldPositions = ViewModel.CurrentGame.HasFieldPositions.GetValueOrDefault(); 

     // I only add the pivot when I need it, otherwise, it won't be shown 
     if (_hasLineups) 
     { 
      if (MainPivot.Items != null) MainPivot.Items.Add(LineupPivotItem); 
     } 

     if (HasFieldPositions) 
     { 
      // Here I place all the items in their proper place on the canvas 
      ArrangeLineup(ViewModel.TeamOneLineup, TeamOneCanvas); 
      ArrangeLineup(ViewModel.TeamTwoLineup, TeamTwoCanvas); 
     } 
    } 

    // Handle other pivots 
} 

private void ArrangeLineup(ObservableCollection<PlayerInLineupViewModel> teamLineup, RationalCanvas canvas) 
{ 
    if (teamLineup == null) 
     return; 

    foreach (var player in teamLineup) 
    { 
     var control = new ContentControl 
     { 
      Content = player, 
      ContentTemplate = LinupPlayerInFieldDataTemplate 
     }; 
     control.SetValue(RationalCanvas.RationalTopProperty, player.Player.FieldPositionLine); 
     control.SetValue(RationalCanvas.RationalLeftProperty, player.Player.FieldPositionSide); 

     canvas.Children.Add(control); 
    } 
} 

Płótno nie jest płótno akcji. Stworzyłem nowe płótno, które wyświetla przedmioty zgodnie z ich względną pozycją (otrzymuję pozycje w skali od 0 do 99).

Logika dzieje w metodzie OverrideArrange:

protected override Size ArrangeOverride(Size finalSize) 
{ 
    if (finalSize.Height == 0 || finalSize.Width == 0) 
    { 
     return base.ArrangeOverride(finalSize); 
    } 

    var yRatio = finalSize.Height/100.0; 
    var xRatio = finalSize.Width/100.0; 

    foreach (var child in Children) 
    { 
     var top = (double) child.GetValue(TopProperty); 
     var left = (double) child.GetValue(LeftProperty); 

     if (top > 0 || left > 0) 
      continue; 

     var rationalTop = (int) child.GetValue(RationalTopProperty); 
     var rationalLeft = (int) child.GetValue(RationalLeftProperty); 

     if (InvertY) 
      rationalTop = 100 - rationalTop; 

     if (InvertX) 
      rationalLeft = 100 - rationalLeft; 

     child.SetValue(TopProperty, rationalTop*yRatio); 
     child.SetValue(LeftProperty, rationalLeft*xRatio); 
    } 

    return base.ArrangeOverride(finalSize); 
} 

Dzięki.

Odpowiedz

4

Istnieje kilka sztuczek, które możesz wypróbować. Na przykład:

  1. w twojej ArrangeOverride można zwarcie logika jeśli wielkość nie uległa zmianie od czasu ostatniego wykonania (a dane są takie same)
  2. Upewnij się, że słuchając informacji o wydarzeniach Pivot że trzeba by przygotować się do prezentacji - PivotItemLoading np
  3. można mieć kontrolę nad faktycznie nie być częścią Pivot, ale zamiast być w kontenerze nadrzędnym (np Grid) i mieć go z Opacity zero . Następnie ustaw go na 100, gdy pojawi się cel PivotItem.
+0

To nie działało w 100%, ale sprawiło, że działało lepiej. Zwinąłem aranżację, ale zrobiłem to z flagą i wystrzeliłem zdarzenie, gdy aranżacja jest zakończona. Przechwycę zdarzenie w osi przestawnej i ukryję pasek postępu, który umieściłem, a następnie wyświetl płótno. Dzięki za pomoc. – CKII