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

ala*_*a27 10 .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.
   ...
}

Sim*_*ier 13

WPF是一个保留的组合引擎.它的意思是你没有做渲染自己挂钩的Rendering事件,而是谱写使用,你会放一个树节点的图像.有关WPF架构的详细信息,请参见此处:WPF架构.我可以向您保证,如果您完全理解本文档以及Rick Sladkey发送的布局系统链接,您还应该了解为什么要在继续使用WPF时更改代码.

如果您使用WPF正确播放(例如:使用依赖属性,例如覆盖Measure&Arrange方法),您将看到它是一个非常强大的引擎,能够在图形树中显示数千个节点.我建议另一个有用的阅读:ZoomableApplication2:百万项


Ric*_*key 7

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

  • 顺序
  • 来自UI线程
  • 没有打电话UpdateLayout,和
  • 没有回来

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

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