gpt4 book ai didi

c# - 如何强制自定义 FrameworkElement 呈现更改的内容?

转载 作者:行者123 更新时间:2023-11-30 22:34:05 24 4
gpt4 key购买 nike

我有一棵视觉树。主窗口有一个全尺寸的 Canvas 。 Canvas 包含一些自定义视觉对象的根。第一个自定义 Visual (A) 可以根据用户正在查看的内容进行扩展和收缩,这些内容位于子项中(Bs,即 DrawingVisuals)。当主窗口调整大小时,我想向 A 添加子项或从 A 中删除子项。当用户在 View 中向任何方向滚动时,可能会发生同样的情况。添加子项 (Bs) 时,我希望对它们进行渲染。 (删除的 B 没有问题,因为它们无论如何都不再可见。)

举个例子:主窗口是 640x480。我将大小调整为该大小的两倍,这将显示更多 B,然后将其添加到 A。到目前为止,我无法让新添加的 B 进行渲染,即使使用 FrameworkElement 的 Invalidate???() 方法也是如此。我在主窗口和添加 B 时在 A 中尝试了 Invalidate???() 。 (我没有使用 Bs,认为它们是新的。)似乎 Invalidate???() 不是可行的方法。

我发现了一个允许新 B 在调整大小时呈现的 hack。在主窗口中,我可以从 Canvas 中删除 A 并将其添加回去,这会强制重新渲染树:

this.contentCanvas.Children.RemoveRange(0, contentCanvas.Children.Count);//删除根this.contentCanvas.Children.Add(this.CustomVisual_A);//读取根

由于显而易见的原因,这是不可取的,尤其是在滚动时。具体来说,正在添加和删除的B是这样管理的,因为它们很大,我需要尽可能减少内存占用并提高渲染速度。这就是我要解决问题的原因。

有人可以帮助我了解我需要做什么才能让新添加的 B 进行渲染吗?非常感谢!

最佳答案

我解决了这个问题。即使 FrameworkElement 是自定义的,您也需要使用标准的 AddVisualChild()RemoveVisualChild() 方法来管理您的 child :

this.AddVisualChild(new B());
...
this.RemoveVisualChild(existingB);

您仍然维护自己的 B 集合,但似乎除非您使用 AddVisualChild()RemoveVisualChild() 底层 FrameworkElement看不到变化(实际上是 Panel,Canvas 的父类(super class))。

这也可能让 parent 以某种方式参与通知;没有把握。最终,这些集合管理方法导致调用在 Panel 上定义的 OnVisualChildrenChanged() 方法,因此它应该在 A 中实现。那时我在我的内部添加/删除 child 集合,然后在基础上调用:

protected override void OnVisualChildrenChanged(DependencyObject added, DependencyObject removed)
{
if (added != null)
{
this.children.Add((B) added);
}

if (removed != null)
{
this.children.Remove((B) removed);
}

base.OnVisualChildrenChanged(added, removed);
}

这会导致一些内部指示需要渲染。

我认为必须发生类似的事情,因为从我的自定义 Canvas 中删除 A 并重新添加 A 会强制渲染。

关于c# - 如何强制自定义 FrameworkElement 呈现更改的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8000688/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com