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.
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