wpf - 在可视化树中移动 UIElement 而不重新计算布局

标签 wpf .net-4.0 visual-tree

我们有一个使用 Docking Control (Actipro) 的 WPF 应用程序 (.Net 4.0)。我们可以关闭对接窗口。在这种情况下,将创建一个“真实”窗口并将内容分配给该窗口。

当然,移动视觉树中的内容将重新触发完整的布局。这是有问题的,因为在这些停靠窗口之一中,我们有一个图表控件(Mindfusion Chartming,WPF 控件),它可能需要长达 10 秒的时间才能完全布局自身(非常大的图表)。

我认为这个问题没有任何直接的解决方案。然而我想知道其他有类似问题的程序员是如何解决这个问题的。有什么聪明的方法可以避免重新计算布局吗?

理论上,由于图表位于 ScrollViewer 内部,因此实际上没有任何变化,因此无论何时放置它,可用空间量都保持不变(无限)。

编辑:另请注意,内部的图表控件是交互式的。我们需要拖放。

最佳答案

这是一个想法。

  1. 创建一个继承自 Decorator 的自定义类。
  2. 将图表控件包装在装饰器内。
  3. 重写MeasureOverride并简单地调用base.Measure,但在返回之前将结果存储在字段中。
  4. 添加一个属性,使您能够禁用测量调用。如果该属性为 true,则只需在 MeasureOverride 中返回先前的大小,而不是调用 base.Measure。
  5. 在更改视觉层次结构时设置该属性。

从我的头脑中,我想不出任何理由说明这不起作用。

不久前我实际上做了一些非常类似的事情。在NovaMind中实现侧面板的滑动动画时我使用装饰器来防止内容在面板设置其宽度动画时执行布局。我使用最终宽度计算了大小,将其存储,然后使用 MeasureOverride 来伪造当前大小...这可以防止在尝试对复杂控件的宽度进行动画处理时涉及的性能问题。 :)

关于wpf - 在可视化树中移动 UIElement 而不重新计算布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3968072/

相关文章:

c# - 将文件拖放到 wpf/C# 应用程序时,如何维护 Windows 资源管理器中的文件顺序?

c# - 在 WPF 中获取窗口的真实位置

c# - 当我期望它选择非泛型方法时,方法重载选择了泛型方法

c# - Jquery ddl更改事件未触发

c# - 为什么 VisualTreeHelper.GetChildrenCount() 为 Popup 返回 0?

WPF - 如何检测何时添加了新的 Visual 子元素?

c# - 基于 ItemsControl 中的验证项的 WPF 启用/禁用按钮

c# - 如何在wpf中获取当前应用程序路径

c# - IGeoPositionWatcher<GeoPosition>.PositionChanged 没有被解雇,但是 GeoCoordinateWatcher.PositionChanged 是

c# - 在动态填充的 TabControl 中为 TabItems 设置正确的 DataContext