Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测子特性是否已更改_C#_Wpf_Storyboard_Inotifypropertychanged_Helix 3d Toolkit - Fatal编程技术网

C# 如何检测子特性是否已更改

C# 如何检测子特性是否已更改,c#,wpf,storyboard,inotifypropertychanged,helix-3d-toolkit,C#,Wpf,Storyboard,Inotifypropertychanged,Helix 3d Toolkit,我想为ModelVisual3D设置动画,但无法检测父对象的参照系何时发生更改 public class FrameOfReference { private double _x, _y, _z, _a, _b, _c, _legLength; private ModelVisual3D _model; private Transform3DGroup _transformGroup; public FrameOfReference() {

我想为ModelVisual3D设置动画,但无法检测父对象的参照系何时发生更改

public class FrameOfReference
{
    private double _x, _y, _z, _a, _b, _c, _legLength;
    private ModelVisual3D _model;
    private Transform3DGroup _transformGroup;

    public FrameOfReference()
    {
        _x = 0;
        _y = 0;
        _z = 0;
        _a = 0;
        _b = 0;
        _c = 0;
    }

    public double X
    {
        get { return _x; }
        set { _x = value; UpdateTransformGroup();}
    }

    public double Y
    {
        get { return _y; }
        set {
            _y = value; UpdateTransformGroup();}
    }

    public double Z
    {
        get { return _z; }
        set { _z = value; UpdateTransformGroup();}
    }

    public double A
    {
        get { return _a; }
        set{ _a = value; UpdateTransformGroup();}
    }

    public double B
    {
        get { return _b; }
        set { _b = value; UpdateTransformGroup();}
    }

    public double C
    {
        get { return _c; }
        set { _c = value; UpdateTransformGroup();}
    }
    public void Transform3DGroup UpdateTransformGroup()
    {
            //convert ZYX Euler angles into a transformgroup
            Transform3DGroup group = new Transform3DGroup();
            Vector3D e = new Vector3D(C, B, A);
            Quaternion q = new Quaternion(new Vector3D(0.0, 0.0, 1.0), e.Z)
                * new Quaternion(new Vector3D(0.0, 1.0, 0.0), e.Y)
                * new Quaternion(new Vector3D(1.0, 0.0, 0.0), e.X);
            AxisAngleRotation3D r = new AxisAngleRotation3D(q.Axis, q.Angle);
            group.Children.Add(new RotateTransform3D(r));
            group.Children.Add(new TranslateTransform3D(X, Y, Z));
            _transformGroup = group;
    }
    public Transform3DGroup TransformGroup
    {
        get
        { return _transformGroup;}
        set { _transformGroup = value;}

    }
}
我有一个类FrameOfReference,它是一个3D坐标系,使用ZYX Euler角来描述方向。此类具有一个TransformGroup属性,该属性反映帧的位置,该位置在X、Y、Z、a、B或C发生更改时更新。对我来说,与ZYX Euler角交互以创建变换,而不是变换组,这一点非常重要

我还有一个类EOAT(“手臂末端工具”),它具有FrameOfReference和ModelVisual3D属性。如果FrameOfReference的属性已更改,我将尝试更新ModelVisual3D

public class FrameOfReference
{
    private double _x, _y, _z, _a, _b, _c, _legLength;
    private ModelVisual3D _model;
    private Transform3DGroup _transformGroup;

    public FrameOfReference()
    {
        _x = 0;
        _y = 0;
        _z = 0;
        _a = 0;
        _b = 0;
        _c = 0;
    }

    public double X
    {
        get { return _x; }
        set { _x = value; UpdateTransformGroup();}
    }

    public double Y
    {
        get { return _y; }
        set {
            _y = value; UpdateTransformGroup();}
    }

    public double Z
    {
        get { return _z; }
        set { _z = value; UpdateTransformGroup();}
    }

    public double A
    {
        get { return _a; }
        set{ _a = value; UpdateTransformGroup();}
    }

    public double B
    {
        get { return _b; }
        set { _b = value; UpdateTransformGroup();}
    }

    public double C
    {
        get { return _c; }
        set { _c = value; UpdateTransformGroup();}
    }
    public void Transform3DGroup UpdateTransformGroup()
    {
            //convert ZYX Euler angles into a transformgroup
            Transform3DGroup group = new Transform3DGroup();
            Vector3D e = new Vector3D(C, B, A);
            Quaternion q = new Quaternion(new Vector3D(0.0, 0.0, 1.0), e.Z)
                * new Quaternion(new Vector3D(0.0, 1.0, 0.0), e.Y)
                * new Quaternion(new Vector3D(1.0, 0.0, 0.0), e.X);
            AxisAngleRotation3D r = new AxisAngleRotation3D(q.Axis, q.Angle);
            group.Children.Add(new RotateTransform3D(r));
            group.Children.Add(new TranslateTransform3D(X, Y, Z));
            _transformGroup = group;
    }
    public Transform3DGroup TransformGroup
    {
        get
        { return _transformGroup;}
        set { _transformGroup = value;}

    }
}
我的类是EOAT,包含模型Visual3D和FrameOfReference

class EOATModel
{

    private FrameOfReference _frame;
    private ModelVisual3D _model;

    public EOATModel()
    {
        Frame = new FrameOfReference();
    }

    public EOATModel(FrameOfReference Frame)
    {
        this.Frame = Frame;
    }

    public FrameOfReference Frame
    {
        get
        {
            return _frame;
        }
        set
        {
            _frame = value;
            CreateModel();
        }
    }

    public ModelVisual3D Model
    {
        get
        {
            return _model;
        }
        set
        {
            _model = value;
        }
    }

    public void CreateModel()
    {
        if (_model != null)
        {
            //--a bunch of code that makes the EOAT since its irrelevant--

            _model.Children.Add(EOATCube);
            _model.Transform = Frame.TransformGroup;
        }
    }

}
一些示例代码显示了我是如何生成eoat的

public class Main
{
    EOAT _eoat = new EOAT()
    _eoat.Frame.X = 100;
    _eoat.Frame.Y = 100;
    _eoat.Frame.Z = 100;
    _eoat.Frame.A = 100;
    _eoat.Frame.B = 100;
    _eoat.Frame.C = 100;
    _eoat.Model = new ModelVisual3D();
    viewPort3d.Children.Add(_eoat.Model);
    _eoat.Frame.C = 45;
}
如果输入“_eoat.Frame.C=45,_eoat内的FrameOfReference不会检测到帧已更改,因此不会使用CreateModel()更新模型。我知道我可以在更改帧后手动调用CreateModel(),但当需要制作动画情节提要时,这将不起作用,因为动画只是随着时间的推移更改一个值,并且在动画期间无法调用CreateModel()

简而言之,我如何让EOAT在框架内的任何内容发生更改时自动调用CreateModel()。我已经尝试过INotifyPropertyChange代码,但没有任何一个代码能够正常工作


对所有内容感到抱歉。我希望这个问题有意义。谢谢。

您只需将事件处理程序添加到
FrameOfReference
NotifyPropertyChanged
事件中,然后从事件处理程序调用
CreateModel

public EOATModel()
{
    Frame = new FrameOfReference();
    Frame.PropertyChanged += (o,e) => CreateModel());
}

那是丢失的一块!谢谢你,乔治。现在我要做的就是弄清楚如何创建这些依赖属性,这样我就可以在目标属性情节提要中引用它们。