从 ViewPort 中删除 ScreenSpaceLines3D 对象?

Remove a ScreenSpaceLines3D Object from a ViewPort?

提问人:Mathew Kirschbaum 提问时间:11/15/2013 最后编辑:Ňɏssa PøngjǣrdenlarpMathew Kirschbaum 更新时间:2/21/2018 访问量:781

问:

我正在使用 VB 中的 WPF 制作 3D 游戏,并且我正在使用我发现 http://3dtools.codeplex.com/releases/view/2058 的 ScrennSpaceLines3D 对象,但是当我尝试删除一条线时,我使用

    mainViewport.Children.RemoveAt(i)

它给出一个 NullExceptionError。我读到这是因为它没有完全脱离渲染队列。已经有针对 c# 的修复程序,但我还没有找到适用于 VB 的修复程序。有没有办法让它工作,或者可能以其他方式在 3D 空间中画一条线?我觉得很荒谬,VB 甚至没有办法轻松绘制 3D 线条......

WPF vb.net DLL 3D NullReferenceException

评论

0赞 Noctis 11/15/2013
我觉得很荒谬,.Net 也没有像样的图表工具......但我们能做的不多。你有没有考虑过学习 C#?:).另外,你有一个错别字,应该是我相信......[似乎您使用的库自 2007 年以来就没有更新过......只是说......]ScrennSpaceLines3DScreen
0赞 Mathew Kirschbaum 11/15/2013
好吧,我不学习 C# 的 2 个原因:1.My 计算机类使用 VB。我宁愿使用 C++ 而不是 C#,但我不能使用任何一个,所以这无关紧要。

答:

0赞 Johann Bescond 5/17/2015 #1

删除 ScreenSpaceLines3D :

            foreach (ScreenSpaceLines3D line3D in lines3DList)
            {
                lines3D.Points.Clear(); // Very importante
                _viewport3D.Children.Remove(lines3D);
             }
0赞 ViRuSTriNiTy 2/20/2018 #2

我参加聚会有点晚了,但我遇到了同样的问题。

发生访问冲突的原因是每个实例都向合成目标的 Rendering 事件注册一个事件处理程序

public ScreenSpaceLines3D()
{
    ...

    CompositionTarget.Rendering += OnRender; // <-- this line
}

但在从场景中移除实例时忘记将其移除。

因此,要解决这个问题,您需要触摸源代码:

public ScreenSpaceLines3D()
{
    ...

    // event registration removed
}

private bool AttachedToCompositionTargetRendering { get; set; }

protected override void OnVisualParentChanged(DependencyObject oldParent)
{
    base.OnVisualParentChanged(oldParent);

    var parent = VisualTreeHelper.GetParent(this);

    if (parent == null)
    {
        if (AttachedToCompositionTargetRendering)
        {
            CompositionTarget.Rendering -= OnRender;

            AttachedToCompositionTargetRendering = false;
        }
    }
    else
    {
        if (!AttachedToCompositionTargetRendering)
        {
            CompositionTarget.Rendering += OnRender;

            AttachedToCompositionTargetRendering = true;
        }
    }
}