3

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

    mainViewport.Children.RemoveAt(i)

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

4

2 回答 2

0

删除 ScreenSpaceLines3D :

            foreach (ScreenSpaceLines3D line3D in lines3DList)
            {
                lines3D.Points.Clear(); // Very importante
                _viewport3D.Children.Remove(lines3D);
             }
于 2015-05-17T15:59:10.347 回答
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;
        }
    }
}
于 2018-02-20T15:04:23.640 回答