我有一个 Visuals 的树。主窗口有一个全屏的画布,画布持有自定义 Visuals 的根节点。第一个自定义 Visual (A) 可以展开或收缩,根据用户浏览的子节点 (Bs, 是 DrawingVisuals)。当主窗口改变大小时,我想要添加或移除 A 的子节点。当用户在视图中向任何方向滚动时,情况也可能发生变化。当添加子节点 (Bs) 时,我希望它们被呈现出来。(被移除的 Bs 不是问题,因为它们已经不可见了。)
举个例子:主窗口的尺寸为 640x480。我将其调整为两倍大小,这会显示更多的 Bs,然后将它们添加到 A 中。迄今为止,我无法使新添加的 Bs 呈现,即使在 FrameworkElement 的 Invalidate??() 方法中使用也无效。我已经尝试在主窗口和 A 中添加 Bs 时使用过 Invalidate??() 方法(我并没有尝试在 Bs 中使用,因为它们是新的)。看起来 Invalidate??() 不是解决问题的方法。
我发现了一个 hack,在调整大小时可以让新的 Bs 被渲染。在主窗口中,我可以删除 A 并重新添加,这样可以强制重新绘制树:
this.contentCanvas.Children.RemoveRange(0, contentCanvas.Children.Count); // 删除根节点 this.contentCanvas.Children.Add(this.CustomVisual_A); // 重新添加根节点
出于明显的原因,这是不可取的,特别是在滚动时。具体来说,被添加和删除的 Bs 是以那种方式管理的,因为它们相当大,我需要尽可能地减少内存占用并提高渲染速度。这就是为什么我要费这么大的劲。
有人可以帮助我理解如何使新添加的 Bs 被呈现吗?非常感谢!
举个例子:主窗口的尺寸为 640x480。我将其调整为两倍大小,这会显示更多的 Bs,然后将它们添加到 A 中。迄今为止,我无法使新添加的 Bs 呈现,即使在 FrameworkElement 的 Invalidate??() 方法中使用也无效。我已经尝试在主窗口和 A 中添加 Bs 时使用过 Invalidate??() 方法(我并没有尝试在 Bs 中使用,因为它们是新的)。看起来 Invalidate??() 不是解决问题的方法。
我发现了一个 hack,在调整大小时可以让新的 Bs 被渲染。在主窗口中,我可以删除 A 并重新添加,这样可以强制重新绘制树:
this.contentCanvas.Children.RemoveRange(0, contentCanvas.Children.Count); // 删除根节点 this.contentCanvas.Children.Add(this.CustomVisual_A); // 重新添加根节点
出于明显的原因,这是不可取的,特别是在滚动时。具体来说,被添加和删除的 Bs 是以那种方式管理的,因为它们相当大,我需要尽可能地减少内存占用并提高渲染速度。这就是为什么我要费这么大的劲。
有人可以帮助我理解如何使新添加的 Bs 被呈现吗?非常感谢!