2015-05-11 27 views
5

Ho un pivot con diversi PivotItem, uno dei quali contiene una tela che posiziona i suoi elementi in posizioni dinamiche (a seconda dei dati). Ottengo i dati e posso posizionare gli elementi al loro posto prima che l'utente possa scegliere questo elemento (questo non è il primo pivot). Tuttavia, solo quando seleziono PivotItem, l'area di disegno si esegue il rendering, quindi è possibile vederlo sfarfallio prima che venga mostrato come dovrebbe.Forza il pivot sul precarico prima che venga mostrato

C'è un modo per forzare il rendering del canvas prima che venga mostrato, quindi tutto è pronto quando l'utente lo vede?

Il mio codice simile a questa:

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

La tela non è lo stock di tela. Ho creato una nuova tela che visualizza gli oggetti in base alla loro posizione relativa (ottengo le posizioni in una scala da 0 a 99).

La logica avviene nel metodo 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); 
} 

Grazie.

risposta

4

Ci sono diversi trucchi da provare. Per esempio:

  1. Nel vostro ArrangeOverride è possibile corto circuito della logica se la dimensione non è cambiata dall'ultima volta avete eseguito (e il dato è lo stesso)
  2. Assicurarsi che si sta ascoltando il eventi in Pivot che ti dicono di essere pronti per la presentazione - PivotItemLoading ad esempio
  3. si può avere il controllo non effettivamente parte del Pivot, ma invece essere nel contenitore padre (ad esempio un Grid) e farlo con Opacity zero . Quindi impostarlo su 100 quando viene visualizzato il target PivotItem.
+0

Non ha funzionato al 100%, ma ho funzionato meglio. Ho cortocircuitato l'arrangiamento, ma l'ho fatto con una bandiera e ho sparato un evento quando l'arrangiamento è terminato. Catturo l'evento nel pivot e nascondo una barra di avanzamento che ho inserito, quindi visualizzo la tela. Grazie per l'aiuto. – CKII

Problemi correlati