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