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