2

说我有一个Canvas包含一个孩子Rectangle。然后用户通过将左上角向上和向左拉来调整矩形的大小(使右下角保持锚定)。

Rectangle 的新位置和大小设置如下(准代码):

Canvas.SetLeft(rectangle, newLeft);
Canvas.SetTop(rectangle, newTop);
rectangle.Width += oldLeft - newLeft;
rectangle.Height += oldTop - newTop;

WPF 将针对位置/大小的这些更改中的每一个执行重绘(即,每个属性更改是否会使所涉及的元素无效并自行触发重绘)还是将它们“排队”(“标记为脏”)并一次全部执行在一些“下一次重绘”(无论何时)?

编辑:我很好奇设置 Canvas.Left 和 Canvas.Top 在多大程度上(如果有)分别代表冗余/低效代码,因为在这种情况下InvalidateArrange完成了多次调用Canvas(与统一的 Canvas.SetTopLeft 相比)Canvas.SetRect方法)。这部分是由于 MSDN 文档中的警告“频繁调用 InvalidateArrange 或特别是 UpdateLayout 会对性能产生重大影响”。

4

1 回答 1

1

通常,一个基本的 WPF 应用程序将有一个线程。这意味着它一次只能做一件事,这也意味着它在读取代码中的指令时无法呈现 UI。因此,当它从您的代码中读取所有指令并且程序执行已到达当前方法的末尾后,它将进入渲染模式以一次性渲染 UI 。

这就是为什么当程序执行正在处理一些尚未使用后​​台线程运行的长时间运行的任务时 UI 会“挂起”的原因(我在这里不是在谈论您的代码)。在当前方法结束并且程序执行可以返回到 UI 之前,UI 将无响应。

于 2013-11-14T13:26:28.293 回答