gpt4 book ai didi

c# - 强制枢轴项目在显示之前预加载

转载 作者:太空狗 更新时间:2023-10-29 23:21:50 26 4
gpt4 key购买 nike

我有一个包含多个 PivotItem 的 Pivot,其中一个包含一个 Canvas ,该 Canvas 将其项目放置在动态位置(取决于数据)。我得到了数据,我可以在用户选择该项目之前将这些项目放在它们的位置(这不是第一个枢轴)。但是,只有当我选择 PivotItem 时, Canvas 才会呈现自身,因此您可以看到它在按应有的方式显示之前闪烁。

有没有办法强制 Canvas 在显示之前进行渲染,以便在用户看到它时一切都准备就绪?

我的代码看起来像这样:

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

Canvas 不是库存 Canvas 。我创建了一个新 Canvas ,它根据项目的相对位置显示项目(我得到的位置范围为 0-99)。

逻辑发生在 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);
}

谢谢。

最佳答案

您可以尝试多种技巧。例如:

  1. 在您的 ArrangeOverride 中,如果自上次执行以来大小没有改变(并且数据相同),您可以将逻辑短路
  2. 确保您正在收听 Pivot 上的事件,这些事件告诉您准备好进行演示 - 例如 PivotItemLoading
  3. 您可以让控件实际上不是 Pivot 的一部分,而是在父容器中(例如 Grid)并使用 Opacity 为零。然后在目标 PivotItem 出现时将其设置为 100。

关于c# - 强制枢轴项目在显示之前预加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30165276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com