如何在WPF中暂停和恢复布局?

时间:2010-12-29 17:17:27

标签: .net wpf

如何在WPF中暂停和恢复布局? 我听说这没必要。但这是非常必要的!

我处理了很多变化位置,如果它们逐个渲染,就会产生延迟效果。

以下是一些代码:


CompositionTarget.Rendering += new EventHandler(Draw);
void Draw(object sender, EventArgs e)
{
   //Clean screen
   for (int i = mainCanvas.Children.Count - 1; i > -1; i--)
   {
     if (mainCanvas.Children[i] is PlayerUserControl || mainCanvas.Children[i] is Image)
     {
           mainCanvas.Children.Remove(mainCanvas.Children[i]);
     }
   }
   //DRAW FLOOR AROUND
   FloorService.FloorEntity[] floorsAround = floorService.selectFloorsAround(Player.id);
   for...
   {
        Image image = new Image();
        image.Source = new BitmapImage(new Uri("/" + floorsAround[i].ImageSource, UriKind.Relative));
        mainCanvas.Children.Add(image);
   }

   //DRAW PLAYERS AROUND
   //Its similar as draw floors around.
   ...
}

4 个答案:

答案 0 :(得分:13)

WPF是保留合成引擎。这意味着您不必自己挂钩Rendering事件,而是使用放在树中的节点撰写图像。有关WPF架构的详细信息,请参阅此处:WPF Architecture。我可以向您保证,如果您完全理解本文档以及Rick Sladkey发送的布局系统链接,您还应该了解为什么要在继续使用WPF时更改代码。

如果你使用WPF正确播放(例如:使用依赖属性,例如覆盖Measure& Arrange方法),你会发现它是一个非常强大的引擎,能够在图形树中显示数千个节点。我建议另一个有用的阅读:ZoomableApplication2: A Million Items

答案 1 :(得分:7)

您没有提供足够的信息,只是说您的“处理了很多变化”。但如果你做了所有这些改变:

  • 顺序
  • 来自UI线程的
  • 未调用UpdateLayout
  • 不返回

然后在这些变化中没有布局。因此,没有任何内容可以暂停或恢复,因为布局总是推迟到您从进行这些更改返回之后。

所以,如果你遇到延迟,那不是因为你没有批量你的布局改变ala WinForms。因此,如果确实是由于布局,减少延迟的唯一方法是避免不必要的布局重新计算。同样,在不知道你在做什么的情况下,不可能提出具体的建议。但是有许多属性可以避免触发递归布局传递。请参阅本文中的布局性能注意事项

答案 2 :(得分:0)

您是否考虑过首先从窗口中删除画布以隐藏它,然后清除并重新将所有项目添加到画布,然后将画布重新添加回窗口?

答案 3 :(得分:0)

他清楚地发布了足够多的信息,即使我只有有限的 wpf 经验也能确切地知道他在说什么。

所以简而言之,他有一个过程,在这个过程中元素被添加/或操作(我假设在循环中),他希望在循环中冻结渲染过程,因为我假设为 1。你可以看到渲染发生和 2. 它很慢

上面有一篇文章提到先移除画布……差不多就是这样。只需将主要父级的可见性设置为折叠,执行元素添加/操作,然后使父级可见