WPF:使用滑块旋转矩形

时间:2015-10-15 14:13:30

标签: c# wpf rotation slider rectangles

我在滚动滑块时尝试旋转矩形 有两个步骤:单击一个矩形 - 滚动滑块。 如果我只画一个矩形,一切都还可以。 但是当我绘制2个或更多的矩形并开始旋转时,我的所有矩形都以相同的角度旋转。 我不知道这个。 谁能帮我? 提前致谢! 这是我的代码:(我在本页的另一篇文章中找到了旋转的代码)

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


  }

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

看起来您正在为所有矩形使用名为“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以避免不必要的分配,而不是每次都这样做。