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

.net 如何在WPF中暂停和恢复布局?,.net,wpf,.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-

如何在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.
   ...
}

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

  • 依次
  • 从UI线程
  • 不调用
    UpdateLayout
    ,以及
  • 不归
那么,在这些更改中不会出现布局。所以,并没有什么可以挂起或恢复的,因为布局总是延迟到您完成这些更改返回之后

因此,如果您遇到延迟,那么这并不是因为您没有通过WinForms批处理布局更改。因此,如果延迟确实是由于布局造成的,那么减少延迟的唯一方法是避免不必要的布局重新计算。同样,如果不知道你在做什么,就不可能提出任何具体的建议。但是有许多属性可以避免触发递归布局过程。请参阅本文中的布局性能注意事项:


    • WPF是一种保留的合成引擎。它的意思是,您不必通过挂接
      rendering
      事件自己进行渲染,而是使用将放入树中的节点编写图像。有关WPF体系结构的详细信息,请参见此处:。我可以向您保证,如果您完全理解本文档以及Rick Sladkey发送的布局系统链接,您还应该理解如果您想继续使用WPF,为什么要更改代码


      如果您正确地使用WPF(例如:使用依赖属性、覆盖度量和排列方法),您将看到它是一个非常强大的引擎,能够在图形树中显示数千个节点。我建议另一个有用的阅读:

      你是否考虑过先从窗口中移除画布,然后将其隐藏,然后清除并重新将所有项目添加到画布中,然后再将画布重新添加回窗口?

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

      简言之,他有一个添加/或操纵元素的过程(我假设在循环中),他希望在循环中冻结渲染过程,因为我假设1。您可以看到正在进行的渲染和2。很慢


      上面有一篇文章提到先移除画布。。。差不多了。只需将主父对象的可见性设置为“折叠”,执行元素添加/操作,然后使父对象可见

      @Alan,在寻找赏金猎人之前,花点时间为问题添加更多信息。也许有人会想出更好的解决办法。即使对于赏金猎人,你也必须添加它!:)@艾伦:你的问题不是没有赏金,而是问题中缺乏细节。我的印象是,您的解决方案(暂停布局)不是您真正想要的,因此人们需要更多的细节来找到问题的根源。这可能会有所帮助:它非常简单,我已经描述过了。对于游戏玩家来说,这更简单。@Alan,在你看来这可能很简单,但你还没有把这个“简单”的问题告诉任何人。你不断重复“造成延迟效应”,却没有解释你的意思。您拒绝提供重现问题的代码示例。你不会解释你想要完成什么。你甚至不会告诉我们这是不是你遇到的真正的问题,或者只是你想象中的一个问题,而从来没有实际证明过。你怎么能指望任何人来帮助你呢?你可以用WPF元素作为精灵获得良好的性能,你甚至可以改变它们在每个渲染中的位置,以获得尽可能快的帧速率。您只需要在一帧到另一帧之间重复使用元素,并通过更改渲染变换的字段来调整它们的位置,而不是在每个周期从头开始重新创建它们。在游戏开发中,我们不使用这种技术,因为很难知道窗口中哪个对象消失了。@Seva在游戏开发中也不使用WPF。@d7samurai,视情况而定:P