我们有一个使用 Docking Control (Actipro) 的 WPF 应用程序 (.Net 4.0)。我们可以关闭对接窗口。在这种情况下,将创建一个“真实”窗口并将内容分配给该窗口。
当然,移动视觉树中的内容将重新触发完整的布局。这是有问题的,因为在这些停靠窗口之一中,我们有一个图表控件(Mindfusion Chartming,WPF 控件),它可能需要长达 10 秒的时间才能完全布局自身(非常大的图表)。
我认为这个问题没有任何直接的解决方案。然而我想知道其他有类似问题的程序员是如何解决这个问题的。有什么聪明的方法可以避免重新计算布局吗?
理论上,由于图表位于 ScrollViewer 内部,因此实际上没有任何变化,因此无论何时放置它,可用空间量都保持不变(无限)。
编辑:另请注意,内部的图表控件是交互式的。我们需要拖放。
最佳答案
这是一个想法。
- 创建一个继承自 Decorator 的自定义类。
- 将图表控件包装在装饰器内。
- 重写MeasureOverride并简单地调用base.Measure,但在返回之前将结果存储在字段中。
- 添加一个属性,使您能够禁用测量调用。如果该属性为 true,则只需在 MeasureOverride 中返回先前的大小,而不是调用 base.Measure。
- 在更改视觉层次结构时设置该属性。
从我的头脑中,我想不出任何理由说明这不起作用。
不久前我实际上做了一些非常类似的事情。在NovaMind中实现侧面板的滑动动画时我使用装饰器来防止内容在面板设置其宽度动画时执行布局。我使用最终宽度计算了大小,将其存储,然后使用 MeasureOverride 来伪造当前大小...这可以防止在尝试对复杂控件的宽度进行动画处理时涉及的性能问题。 :)
关于wpf - 在可视化树中移动 UIElement 而不重新计算布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3968072/