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执行时避免不必要的赋值。
我试图在滚动滑块时旋转一个矩形 有 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执行时避免不必要的赋值。