2015-05-11 5 views
5

Ich habe ein Pivot mit mehreren PivotItems, von denen eines eine Leinwand enthält, die seine Elemente an dynamischen Speicherorten (abhängig von den Daten) platziert. Ich bekomme die Daten, und ich kann die Elemente an ihren Platz stellen, bevor der Benutzer dieses Element auswählen kann (dies ist nicht der erste Drehpunkt). Aber nur wenn ich das PivotItem auswähle, rendert sich die Leinwand selbst, so dass man sie flimmern sieht, bevor sie angezeigt wird.Erzwingen Pivot-Element zu laden, bevor es angezeigt wird

Gibt es eine Möglichkeit, die Leinwand zu rendern, bevor sie angezeigt wird, sodass alles vorbereitet ist, wenn der Benutzer es sieht?

Mein Code sieht in etwa wie folgt aus:

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

Die Leinwand ist nicht die Lager Leinwand. Ich habe einen neuen Canvas erstellt, der Elemente entsprechend ihrer relativen Position anzeigt (ich bekomme die Positionen in einer Skala von 0-99).

Die Logik geschieht in der OverrideArrange Methode:

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

Dank.

Antwort

4

Es gibt mehrere Tricks, die Sie ausprobieren könnten. Zum Beispiel:

  1. In Ihrem ArrangeOverride Sie können Kurzschluss die Logik, wenn die Größe seit dem letzten Mal nicht geändert hat Sie ausgeführt (und die Daten gleich)
  2. Achten Sie darauf, zu der gerade hören Ereignisse auf Pivot die Ihnen sagen, für die Präsentation fertig zu machen - PivotItemLoading beispielsweise
  3. Sie die Kontrolle haben, können nicht tatsächlich ein Teil des Pivot, sondern werden in der übergeordneten Container (zB ein Grid) und haben es mit Opacity von Null sein . Setzen Sie es dann auf 100, wenn das Ziel PivotItem in Sicht kommt.
+0

Es hat nicht 100% funktioniert, aber ich habe es besser funktioniert. Ich habe das Arrangement kurzgeschlossen, aber ich habe es mit einer Flagge gemacht und eine Veranstaltung gefeuert, als das Arrangement fertig ist. Ich fange das Ereignis im Pivot auf und blende einen Fortschrittsbalken aus, den ich platziert habe, und zeige dann die Leinwand an. Danke für die Hilfe. – CKII