0

请根据我的要求找到附加的图像。当拖动弧(边框)时,弧和滚轮通过鼠标位置旋转。你能帮我吗?如果在按钮中旋转弧和轮,请单击它工作。但我想在拖动边框(弧)中旋转它。我被计算卡住了。

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

在此处输入图像描述

4

1 回答 1

0

首先,我会改变这些行:

if (angle >= 360)
        angle = 0;
    angle += 30;

到这一行:

angle = angle >= 330 ? 0 : angle + 30;

尽管我怀疑它会导致太多问题。在您的代码中,angle例如,如果等于 350,那么它最终会是 380,但是 WPF 应该将该角度环绕到 20 的有效角度。

Ahhhhhhhh ...我刚刚解决了您的确切要求...您希望用户移动鼠标,并且您希望形状旋转到用户移动鼠标的距离,以便看起来它们实际上是物理移动它。

对,就这样……我可以解释你必须做什么,但不能为你做。我希望你的三角学很好,因为我已经几十年没用过了!基本上,如果我没记错的话,我们想创建一些假想的三角形来获得我们的计算数字。三角形的点将来自圆心和圆周周围的各个点。所以第一件事是记下Point圆心所在的确切位置......我将把它留给你。

接下来,我们要找到要使用的其他图形。一个总是在中心的正上方、下方、左侧或右侧,因此我们的三角形将始终具有直角......如果我们想要调用Math.SinMath.Cos返回有效结果,我们需要这个。如果您不了解三角学,可以通过查看Maths Is Fun 网站上的Sine、Cosine 和 Tangent页面了解更多信息。

每个三角形的第三个也是最后一个点将是鼠标的位置,或者更准确地说,是鼠标光标方向在圆周上的位置。这是通过创建一个更大的假想圆来实现的,该圆包括鼠标光标位置、圆心和圆心正上方、下方、左侧或右侧的位置,这样我们更大的三角形也有一个直角。

形成这些假想的三角形(您可能会受益于在纸上绘制这些以帮助可视化情况),然后您可以使用MathSinCos方法来计算将形状旋转到所需的角度。尽管我认为该RotateTransform.Angle属性以度为单位(MSDN 目前不可用),但您可能需要调整生成的角度值以适应 WPF 奇怪的 0 度位置(通过添加或减去 90 的除数)。

最后一件事是我祝你好运。

于 2013-09-04T11:01:23.577 回答