从ObservableCollection中删除3D元素

时间:2013-07-11 12:58:55

标签: c# wpf mvvm 3d mvvm-light

在我的WPF 4.0项目中,我有一个ObservableCollection,它包含视图中的一些选定的Visual3D:

public ObservableCollection<Visual3D> SelectedElements
        {
            get { return _selectedElements; }
            set
            {
                if (Equals(_selectedElements, value))
                {
                    return;
                }

                _selectedElements = value;
                RaisePropertyChanged(() => SelectedElements);
            }
        }

通过单击选择Visual3D元素,VM中的源代码为:

public HitTestResultBehavior HitTestDown(HitTestResult result)
        {
            var resultMesh = result as RayMeshGeometry3DHitTestResult;

            if (resultMesh == null)
                return HitTestResultBehavior.Continue;

            // Obtain clicked ModelVisual3D.
            var vis = resultMesh.VisualHit as ModelVisual3D;


            if (vis != null)
            {
                Type visType = vis.GetType();
                if (visType.Name == "TruncatedConeVisual3D" || visType.Name == "BoxVisual3D")
                {
                    var geoModel = resultMesh.ModelHit as GeometryModel3D;
                    if (geoModel != null)
                    {
                        var selecteMat = geoModel.Material as DiffuseMaterial;
                        if (selecteMat != null) selecteMat.Brush.Opacity = selecteMat.Brush.Opacity <= 0.7 ? 1 : 0.7;
                    }

                    // Otherwise it's a chair. Get the Transform3DGroup.
                    var xformgrp = vis.Transform as Transform3DGroup;

                    // This should not happen, but play it safe anyway.
                    if (xformgrp == null)
                    {
                        return HitTestResultBehavior.Stop;
                    }


                    // Loop through the child tranforms.
                    foreach (Transform3D t in xformgrp.Children)
                    {
                        // Find the TranslateTransform3D.
                        var trans =
                            t as TranslateTransform3D;

                        if (trans != null)
                        {
                            // Define an animation for the transform.
                            var anima = new DoubleAnimation();
                            if (trans.OffsetY == 0)
                            {
                                DependencyProperty prop = TranslateTransform3D.OffsetZProperty;

                                if (Math.Abs(trans.OffsetZ) < 2)
                                {
                                    anima.To = 20.5*Math.Sign(trans.OffsetZ);
                                    Debug.Assert(SelectedElements != null, "SelectedElements != null");
                                }

                                else
                                {
                                    anima.To = 1*Math.Sign(trans.OffsetZ);
                                    SelectedElements.Add(vis);

                                }

                                // Start the animation and stop the hit-testing.
                                trans.BeginAnimation(prop, anima);
                                return HitTestResultBehavior.Stop;
                            }
                        }
                    }
                }
            }

            return (HitTestResultBehavior) HitTestFilterBehavior.Continue;
        }

我想删除一个或所有这个Visual3D元素 提前谢谢

我已实施此方法,但它不起作用:

private void UnloadProduct()
    {
        if (CanUnload)
        {
            foreach (Visual3D selectedElement in SelectedElements)
            {
                if (selectedElement.DependencyObjectType.Name == "TruncatedConeVisual3D")
                {
                    var test = (TruncatedConeVisual3D) selectedElement;
                    int id = test.VisualId;
                    ElementsCollection.RemoveAt(id);
                    RaisePropertyChanged(() => ElementsCollection);
                }
                else
                {
                    var test = (BoxVisual3D) selectedElement;
                    int id = test.VisualId;
                    ProductsCollection.RemoveAt(id);
                }
            }
        }
    }

0 个答案:

没有答案