WPF:使用滑块旋转矩形

WPF: Rotate a rectangle with slider

我试图在滚动滑块时旋转一个矩形 有 2 个步骤:单击矩形 - 滚动滑块。 如果我只画一个矩形,一切都很好。 但是当我绘制 2 个或更多矩形并开始旋转时,我所有的矩形都以相同的角度旋转。 我对此一无所知。 谁能帮我? 提前致谢! 这是我的代码:(我在这个页面的另一个 post 找到了旋转的代码)

    Shape _shape;
    RotateTransform rt = new RotateTransform();
        private void MyCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs)
        {

                        /////////////////////////////////////////////////////
                        //for know which rectangle has been clicked
                        if (MyTransform_type == TRANSFORM_TYPE.ROTATE)
                        {
                            _shape = e.OriginalSource as Shape;
                            if (_shape != null)
                            {
                               _shape = (Shape)e.OriginalSource;
                            }
                        }

                }


        private void MyCanvas_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
                {
                    if (MyTransform_type != TRANSFORM_TYPE.NONE && MyTransform_type != TRANSFORM_TYPE.ROTATE)
                    {
                        if (_shape == null)
                            return;
                        //_shape.ReleaseMouseCapture();
                        Cursor = Cursors.Arrow;
                    }
                }



        private void sldRotate_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
                {
                    if (_shape != null)
                    { 
                        _shape.RenderTransform = rt;
                        _shape.RenderTransformOrigin = new Point(0.5, 0.5);
                        var da = new DoubleAnimation(rt.Angle, sldRotate.Value, new Duration(TimeSpan.FromSeconds(0.001)));
                        rt.BeginAnimation(RotateTransform.AngleProperty, da);
                        rt.Angle = sldRotate.Value;
                    }


  }

您的错误在于您创建了一个 RotateTransform 对象并将其分配给不同的形状。所以在点击几个矩形之后,每个矩形都有相同的 rotatetransform 实例。如果现在更改 rotatetransform 的值,每个矩形都会旋转...

为了解决这个问题,您应该更改 sldRotate_ValueChanged 方法。检查当前形状是否已经有旋转变换。如果没有则创建一个,如果是则调整 rotatetransform...

另外,如果你的动画时间这么少,你可以直接忽略:

private void sldRotate_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    if (_shape != null)
    {
        var rt = new RotateTransform();
        rt.Angle = sldRotate.Value;
        _shape.RenderTransform = rt;
        _shape.RenderTransformOrigin = new Point(0.5, 0.5);
    }
}

您似乎在为所有矩形使用同一个名为 "rt" 的 RotateTransform。最简单的解决方案是:

    private void MyCanvas_MouseRightButtonDown(object sender, MouseButtonEventArgs)
    {                        
        if (MyTransform_type == TRANSFORM_TYPE.ROTATE)
        {
           _shape = e.OriginalSource as Shape;

           //creating new RotateTransform
           rt=new RotateTransform();

           if (_shape != null)
           {
              _shape = (Shape)e.OriginalSource;
           }
        }
    }

你也可以

    _shape.RenderTransform = rt;

在 MyCanvas_MouseRightButtonDown 之后

    _shape = e.OriginalSource as Shape;

而不是每次都这样做,当sldRotate_ValueChanged执行时避免不必要的赋值。