如何在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.
...
}
答案 0 :(得分:13)
WPF是保留合成引擎。这意味着您不必自己挂钩Rendering
事件,而是使用放在树中的节点撰写图像。有关WPF架构的详细信息,请参阅此处:WPF Architecture。我可以向您保证,如果您完全理解本文档以及Rick Sladkey发送的布局系统链接,您还应该了解为什么要在继续使用WPF时更改代码。
如果你使用WPF正确播放(例如:使用依赖属性,例如覆盖Measure& Arrange方法),你会发现它是一个非常强大的引擎,能够在图形树中显示数千个节点。我建议另一个有用的阅读:ZoomableApplication2: A Million Items
答案 1 :(得分:7)
您没有提供足够的信息,只是说您的“处理了很多变化”。但如果你做了所有这些改变:
UpdateLayout
和然后在这些变化中没有布局。因此,没有任何内容可以暂停或恢复,因为布局总是推迟到您从进行这些更改返回之后。
所以,如果你遇到延迟,那不是因为你没有批量你的布局改变ala WinForms。因此,如果确实是由于布局,减少延迟的唯一方法是避免不必要的布局重新计算。同样,在不知道你在做什么的情况下,不可能提出具体的建议。但是有许多属性可以避免触发递归布局传递。请参阅本文中的布局性能注意事项:
答案 2 :(得分:0)
您是否考虑过首先从窗口中删除画布以隐藏它,然后清除并重新将所有项目添加到画布,然后将画布重新添加回窗口?
答案 3 :(得分:0)
他清楚地发布了足够多的信息,即使我只有有限的 wpf 经验也能确切地知道他在说什么。
所以简而言之,他有一个过程,在这个过程中元素被添加/或操作(我假设在循环中),他希望在循环中冻结渲染过程,因为我假设为 1。你可以看到渲染发生和 2. 它很慢
上面有一篇文章提到先移除画布……差不多就是这样。只需将主要父级的可见性设置为折叠,执行元素添加/操作,然后使父级可见