首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用鼠标移动矩形,不单击任何按钮

用鼠标移动矩形,不单击任何按钮
EN

Stack Overflow用户
提问于 2013-10-08 15:59:29
回答 1查看 350关注 0票数 0

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

我看到了很多例子,但它们都实现了移动形状和矩形鼠标左键,这肯定不是我的要求。

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

XAML

代码语言:javascript
运行
复制
    <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"/>

代码在中的应用

代码语言:javascript
运行
复制
    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();
    }
EN

回答 1

Stack Overflow用户

发布于 2013-10-08 16:52:27

您可能希望考虑在触发Shape_MouseMove时捕获的形状。然后,在画布/窗口上的每一个鼠标移动将形状移动到鼠标光标的中心。然后,您必须决定何时发布它,也许:

  1. 通过检测鼠标何时离开画布/窗口。
  2. 使用按钮显式释放。
  3. 检查mouseMove事件之间的时间。如果1秒过去了,那么就处于一个逻辑状态,在mouseMove中不捕获并且不能捕获该形状。只有当鼠标脱离形状时,才能恢复正常状态。因此,用户将失去移动,并不得不游出和再次进入捕获。
  4. 另外,当进入3中描述的状态时,启动一个计时器,然后如果过了一秒,光标就在形状上,重新捕获。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19252669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档