【问题标题】:Move rectangle with mouse without clicking any button用鼠标移动矩形而不点击任何按钮
【发布时间】:2013-10-08 15:59:29
【问题描述】:

我正在编写一个 silverlight 应用程序,其中有一个要求,即我需要在图像上绘制矩形并随着鼠标移动而移动它。我可以通过按住鼠标左键移动矩形,但现在我需要在不单击或按住鼠标左键的情况下移动。

我见过很多例子,但它们都实现了鼠标左键移动的形状和矩形,这绝对不是我的要求。

我尝试了很多方法,但都无法做到。以下是我目前所做的代码。欢迎提出任何建议。

XAML

    <Canvas x:Name="draw"  Grid.Column="0" Background="Transparent" 
            Margin="0,0,0,150" Grid.RowSpan="2">

        <Rectangle x:Name="SquareBlue" Width="100" Height="100" Canvas.Top="155" Canvas.Left="268" Fill="Transparent" Stroke="Black" StrokeThickness="2" />
    </Canvas>

        <Image x:Name="myImage" Height="100"/>
        <TextBox x:Name="X" Margin="0,0,110,0"></TextBox>
        <TextBox x:Name="Y" Margin="0,0,110,0"/>
        <Image x:Name="pictureBox1" Height="100"/>

代码背后

    Boolean isMouseCaptured;
    Double mouseX;
    Double mouseY;
    Int32 zIndex = 0;

    private void Shape_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        Shape s = sender as Shape;            
        isMouseCaptured = false;            
        s.ReleaseMouseCapture();            
        mouseY = -1;            
        mouseX = -1;  
    }

    private void Shape_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        Shape s = sender as Shape;
        mouseY = e.GetPosition(null).Y;
        mouseX = e.GetPosition(null).X;
        isMouseCaptured = true;
        s.CaptureMouse();

        s.SetValue(Canvas.ZIndexProperty, zIndex);
        zIndex++;
    }

    private void Shape_MouseMove(object sender, MouseEventArgs e)
    {
        if (isMouseCaptured)
        {
            Shape s = sender as Shape; 
            double deltaY = e.GetPosition(null).Y - mouseY; 
            double deltaX = e.GetPosition(null).X - mouseX; 
            double newTop = deltaY + (double)s.GetValue(Canvas.TopProperty); 
            double newLeft = deltaX + (double)s.GetValue(Canvas.LeftProperty);

            s.SetValue(Canvas.TopProperty, newTop); 
            s.SetValue(Canvas.LeftProperty, newLeft);

            mouseY = e.GetPosition(null).Y; 
            mouseX = e.GetPosition(null).X;

            X.Text = mouseX.ToString();
            Y.Text = mouseY.ToString();
    }

【问题讨论】:

    标签: c# silverlight xaml


    【解决方案1】:

    您可能需要考虑触发 Shape_MouseMove 时捕获的形状。 然后,画布/窗口上的每一次鼠标移动都会将形状移动到以鼠标光标为中心的位置。 然后你必须决定何时发布它:

    1. 通过检测鼠标何时离开画布/窗口。
    2. 使用按钮显式释放。
    3. 检查 mouseMove 事件之间的时间。如果经过了 1 秒,则处于形状不存在且无法在 mouseMove 中捕获的逻辑状态。只有当鼠标变形时,才恢复正常状态。所以用户将失去移动,必须再次将光标移出并再次捕捉。
    4. 此外,当进入 3 中描述的状态时,启动一个计时器,然后如果一秒钟后光标在形状上,则重新捕获。

    【讨论】:

    • 有道理,但是你有相同的示例代码吗,因为我尝试了很多方法!
    • 大部分只是改变你当前的例子。关于计时建议,您可能可以使用 DateTime.Now 来检查时差并使用msdn.microsoft.com/en-us/library/393k7sb1.aspx 中的计时器并将计时器的 AutoReset 设置为 false 以实现我在 4 中的建议。我用于 WinForms 应用程序所以也许silverLight 不会完全一样。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多