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;
}
}
您的错误在于您创建了单个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以避免不必要的赋值。