从ViewPort中删除ScreenSpaceLines3D对象?

时间:2013-11-15 00:05:11

标签: wpf vb.net dll 3d nullreferenceexception

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

添加到视口中
    mainViewport.Children.RemoveAt(i)

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

2 个答案:

答案 0 :(得分:0)

删除ScreenSpaceLines3D:

            foreach (ScreenSpaceLines3D line3D in lines3DList)
            {
                lines3D.Points.Clear(); // Very importante
                _viewport3D.Children.Remove(lines3D);
             }

答案 1 :(得分:0)

我有点迟到了,但我遇到了同样的问题。

发生访问冲突是因为每个实例都将事件处理程序注册到合成目标

的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;
        }
    }
}