提问人:Mathew Kirschbaum 提问时间:11/15/2013 最后编辑:Ňɏssa PøngjǣrdenlarpMathew Kirschbaum 更新时间:2/21/2018 访问量:781
从 ViewPort 中删除 ScreenSpaceLines3D 对象?
Remove a ScreenSpaceLines3D Object from a ViewPort?
问:
我正在使用 VB 中的 WPF 制作 3D 游戏,并且我正在使用我发现 http://3dtools.codeplex.com/releases/view/2058 的 ScrennSpaceLines3D 对象,但是当我尝试删除一条线时,我使用
mainViewport.Children.RemoveAt(i)
它给出一个 NullExceptionError。我读到这是因为它没有完全脱离渲染队列。已经有针对 c# 的修复程序,但我还没有找到适用于 VB 的修复程序。有没有办法让它工作,或者可能以其他方式在 3D 空间中画一条线?我觉得很荒谬,VB 甚至没有办法轻松绘制 3D 线条......
答:
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;
}
}
}
评论
ScrennSpaceLines3D
Screen