繁体   English   中英

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

[英]How can I suspend and resume layout in 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.
   ...
}

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

如果您使用 WPF 正确地使用它(即:使用依赖属性,例如覆盖 Measure 和Arrange 方法),您将看到它是一个非常强大的引擎,能够在图形树中显示数千个节点。 我推荐另一个有用的阅读: ZoomableApplication2: A Million Items

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

  • 依次
  • 从 UI 线程
  • 不调用UpdateLayout ,和
  • 不归

然后在这些更改之间不会发生布局。 因此,没有什么可以暂停或恢复,因为布局总是推迟到您进行这些类型的更改返回之后。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM