请根据我的要求找到附图。当拖动圆弧(边框)时,圆弧和滚轮通过鼠标位置旋转。你能帮我吗?如果旋转圆弧和滚轮按钮单击它工作。但我想在拖动边框(圆弧)中旋转它.i卡住了计算。
XAML:
<Grid HorizontalAlignment="Center">
<StackPanel Orientation="Horizontal" x:Name="mainStackPanel" RenderTransformOrigin="0.5,0.5">
<Grid>
<Border BorderThickness="10" BorderBrush="Blue" MouseMove="Border_MouseMove" MouseLeftButtonDown="Border_MouseLeftButtonDown"
MouseLeftButtonUp="Border_MouseLeftButtonUp" Width="10" Height="90" />
</Grid>
<Grid x:Name="rotateGrid" Margin="20 0 0 0" RenderTransformOrigin="0.5,0.5">
<Ellipse Height="250" Width="250" Stroke="Red" StrokeThickness="20"/>
<Border BorderThickness="10" BorderBrush="Red" Height="15" Width="250"
HorizontalAlignment="Stretch" VerticalAlignment="Center"/>
<Border BorderThickness="10" BorderBrush="Red" Width="15" Height="250"
HorizontalAlignment="Center" VerticalAlignment="Stretch"/>
<Border BorderThickness="10" BorderBrush="Red" Width="15" Height="246" RenderTransformOrigin="0.5,0.5"
HorizontalAlignment="Center" VerticalAlignment="Stretch">
<Border.RenderTransform>
<RotateTransform Angle="45"/>
</Border.RenderTransform>
</Border>
<Border BorderThickness="10" BorderBrush="Red" Width="15" Height="246" RenderTransformOrigin="0.5,0.5"
HorizontalAlignment="Center" VerticalAlignment="Stretch">
<Border.RenderTransform>
<RotateTransform Angle="135"/>
</Border.RenderTransform>
</Border>
</Grid>
<Grid Margin="20 0 0 0">
<Border BorderThickness="10" BorderBrush="Blue" Width="10" Height="90" />
</Grid>
</StackPanel>
Code Behind:
RotateTransform trans = new RotateTransform();
double angle = 30;
Point oldPoint;
Point newPoint;
bool dragStarted = false;
private void Button_Click(object sender, RoutedEventArgs e)
{
trans.Angle = angle;
mainStackPanel.RenderTransform = trans;
if (angle >= 360)
angle = 0;
angle += 30;
}
private void Border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
dragStarted = true;
oldPoint = e.GetPosition(this);
Mouse.Capture(sender as IInputElement);
}
private void Border_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
Mouse.Capture(null);
oldPoint = new Point(0, 0);
newPoint = new Point(0, 0);
dragStarted = false;
}
protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
{
Mouse.Capture(null);
oldPoint = new Point(0, 0);
newPoint = new Point(0, 0);
dragStarted = false;
base.OnMouseLeftButtonUp(e);
}
private void Border_MouseMove(object sender, MouseEventArgs e)
{
if (dragStarted)
{
newPoint = e.GetPosition(this);
if (oldPoint.Y != newPoint.Y)
{
if (oldPoint.Y > newPoint.Y)
trans.Angle = (oldPoint.Y - newPoint.Y);
else
trans.Angle += (newPoint.Y - oldPoint.Y);
mainStackPanel.RenderTransform = trans;
}
}
}
答案 0 :(得分:0)
首先,我会更改这些行:
if (angle >= 360)
angle = 0;
angle += 30;
到这一行:
angle = angle >= 330 ? 0 : angle + 30;
虽然我怀疑这会导致太多问题。在你的代码中,如果angle
等于350,那么它最终将为380,但是WPF应该将该角度包围到有效角度20。
Ahhhhhhh ......我只是计算出你的完全要求...你希望用户移动鼠标,你希望形状旋转就像用户移动鼠标时,实际上看起来实际上是在移动鼠标。
是的,这里......我可以解释你要做什么,但不能为你做。我希望你的三角学很好,因为我已经使用了几十年了!基本上,如果我没记错的话,我们想要创建一些假想的三角形来得到我们的计算数据。三角形的点将来自圆的中心和围绕其圆周的各个点。所以首先要记下圆圈中心所在的确切Point
......我会把它留给你。
接下来,我们想找到其他要使用的数字。一个将始终位于中心的正上方,下方,左侧或右侧,这样我们的三角形将始终具有直角...如果我们想要调用Math.Sin
和{{1},我们需要这个返回有效结果。如果您不了解三角学,可以通过查看Maths Is Fun网站上的Sine, Cosine and Tangent页面了解更多信息。
每个三角形的第三个和最后一个点将是鼠标的位置,或者更确切地说,是鼠标光标方向上圆周上的位置。这是通过创建一个更大的虚圆来实现的,其中包括鼠标光标位置,圆心和中心正上方,下方,左侧或右侧的位置,这样我们更大的三角形也有一个直角。
形成这些虚构的三角形(你可能从纸上绘制这些三角形有助于可视化情况),然后你可以使用Math.Cos
类'Math
和{ {1}}计算旋转形状所需角度的方法。虽然我认为Sin
属性是以度为单位(此时MSDN不可用),但可能需要调整生成的角度值以适应WPF奇怪的0度位置(通过加上或减去90的除数。
最后一件事是祝你好运。