2015-05-11 40 views
5

我有一个透视图与几个透视图,其中一个透视图包含一个将其项目放置在动态位置(取决于数据)的画布。我得到的数据,我可以放置在他们的地方之前,用户可以选择这个项目(这不是第一个枢纽)。但是,只有当我选择PivotItem时,画布才会呈现自身,所以在显示它之前可以看到它闪烁。在显示之前强制数据透视项预加载

有没有办法强制画布在它显示之前呈现,所以一切都准备好了,当用户看到它时?

我的代码看起来是这样的:

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

画布是不是股票画布。我创建了一个新的画布,根据它们的相对位置显示项目(我以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); 
} 

感谢。

回答

4

有几个技巧可以尝试。例如:

  1. 在你ArrangeOverride可以短路逻辑,如果规模没有因为上一次改变了你执行(和数据是一样的)
  2. 确保您听告诉你准备好演示文稿上Pivot事件 - PivotItemLoading例如
  3. 您可以控制没有真正成为Pivot的一部分,而是在父容器(如Grid)和为零Opacity有它。然后在目标PivotItem可见时将其设置为100。
+0

它没有工作100%,但我让它工作得更好。我把这个安排短路了,但是我用一面旗子做了,并且在安排完成后开了一个活动。我在主键中捕捉事件并隐藏我放置的进度条,然后显示画布。谢谢您的帮助。 – CKII

相关问题