【问题标题】:WPF: Rotate a rectangle with sliderWPF:使用滑块旋转矩形
【发布时间】:2015-10-15 14:13:29
【问题描述】:

我试图在滚动滑块时旋转一个矩形 有 2 个步骤: 单击一个矩形 - 滚动滑块。 如果我只画一个矩形,一切都好。 但是当我绘制 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;
                    }


  }

【问题讨论】:

  • 请添加完整的代码,例如你在哪里设置“rt”?
  • "rt" 在我的代码顶部:D

标签: c# wpf rotation slider rectangles


【解决方案1】:

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

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

另外,如果你有这么小的动画时间,你可以把它省略:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多