WPF:用滑块旋转矩形

本文关键字:旋转 WPF | 更新日期: 2023-09-27 18:17:48

我想在滚动滑块时旋转矩形有两个步骤:点击一个矩形-滚动滑块。如果我只画一个矩形,一切都没问题。但是当我画两个或更多的矩形并开始旋转时,所有的矩形都以相同的角度旋转在一起。我不知道这个。有人能帮我吗?提前感谢!以下是我的代码:(我在本页的另一篇文章中找到了旋转代码)

    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;
                    }

  }

WPF:用滑块旋转矩形

您的错误在于您创建了单个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);
    }
}

看起来您正在使用相同的RotateTransform命名为"rt"为您的所有矩形。最简单的解决方案是:

    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_valuechange以避免不必要的赋值。