用鼠标移动矩形,而无需单击任何按钮
本文关键字:单击 任何 按钮 鼠标 移动 | 更新日期: 2023-09-27 18:34:22
我正在编写一个 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();
}
您可能需要考虑触发Shape_MouseMove时捕获的形状。然后,画布/窗口上的每只鼠标移动都会移动形状以鼠标光标为中心。然后,您必须决定何时发布它:
- 通过检测鼠标何时离开画布/窗口。
- 使用按钮显式释放。
- 检查鼠标移动事件之间的时间。 如果经过 1 秒,则处于逻辑状态,其中形状不是,也无法在 mouseMove 中捕获。 仅当鼠标脱离形状时,才恢复正常状态。 因此,用户将失去移动,并且必须再次将光标移出并再次捕获。
- 此外,当进入 3 中所述的状态时,启动一个计时器,然后在一秒钟后光标位于形状上,请重新捕获。