wpf - 使对象在 MouseDown 上跟随鼠标,在 MouseUp 上跟随 "Stick"

标签 wpf vb.net cursor-position onmousedown onmouseup

我正在处理一个 WPF 和 VB.net 项目。我想在视觉上模拟“拖动”一个对象(尽管我出于目的不想使用标准拖放)。

基本上,我有一个标签对象,在其 MouseDown 事件中,我希望它在 640x480 实体大小的网格内(但不在网格外!)跟随鼠标光标。请注意,此网格位于全屏窗口的中央。同样,对象不应在网格外跟随鼠标(我猜这里是“ClipToBounds = True”)

然后,在标签的 MouseUp 事件中,我希望它要么停留在当前位置,要么返回到其原始位置,这由另一个对象的 MouseEnter 属性设置的 bool 变量值决定。

请注意,如果使用起来更容易,我可以轻松地将网格更改为 Canvas 。我猜这是可取的。

那么,在冗长的解释之后,这是我的问题(双重):

  1. 如何使对象(标签)在网格/ Canvas 内跟随鼠标光标,但不在其外?这需要在标签的 MouseDown 事件上发生。

  2. 如何让对象“固定”在当前位置? (由此,我大概可以想出如何让它自己回到原来的位置。:D)

我投票给任何能帮助我最有效地完成这个目标的人!非常感谢大家。

最佳答案

这样的事情怎么样:

XAML:

<Canvas x:Name="canv" ToolTip="tt one" Width="400" Height="400" Background="Blue">
    <Rectangle x:Name="rec" Fill="Red" Height="50" Width="50" MouseDown="Rectangle_MouseDown" MouseMove="Rectangle_MouseMove" MouseUp="Rectangle_MouseUp" />
</Canvas>

代码隐藏:

    private bool isDragging;
    private void Rectangle_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        rec.CaptureMouse();
        isDragging = true;

    }

    private void Rectangle_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
    {
        if (isDragging)
        {
            Point canvPosToWindow = canv.TransformToAncestor(this).Transform(new Point(0, 0));

            Rectangle r = sender as Rectangle;
            var upperlimit = canvPosToWindow.Y + (r.Height / 2);
            var lowerlimit = canvPosToWindow.Y + canv.ActualHeight - (r.Height / 2);

            var leftlimit = canvPosToWindow.X + (r.Width / 2);
            var rightlimit = canvPosToWindow.X + canv.ActualWidth - (r.Width / 2);


            var absmouseXpos = e.GetPosition(this).X;
            var absmouseYpos = e.GetPosition(this).Y;

            if ((absmouseXpos > leftlimit && absmouseXpos < rightlimit)
                && (absmouseYpos > upperlimit && absmouseYpos < lowerlimit))
            {
                Canvas.SetLeft(r, e.GetPosition(canv).X - (r.Width / 2));
                Canvas.SetTop(r, e.GetPosition(canv).Y - (r.Height / 2));
            }
        }
    }

    private void Rectangle_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        rec.ReleaseMouseCapture();
        isDragging = false;
    }

这段代码可以改进,但我想你明白了 ;)

关于wpf - 使对象在 MouseDown 上跟随鼠标,在 MouseUp 上跟随 "Stick",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5659237/

相关文章:

database - 如何从数据库获取用于Graphql中分页的光标?

c# - 单击多个复选框时,如何以字符串格式(列表<字符串> 或任何其他逻辑数据结构)存储 ListView 行项

c# - ListBox ItemTemplate 中的按钮未选择项目

ASP.NET 导出到 Excel - 锁定单元格

javascript - 在屏幕调整大小时响应式地更改 Canvas 尺寸,而不会丢失光标位置跟踪

python - 在文本小部件中设置光标位置

c# - 在 MVVM 中显示对话框并设置对话框选项

.net - 仅检查指定的按键是否按下

vb.net - 移动目录中的文件夹

c# - 我如何将参数从javascript传递到控件vb.net中的隐藏字段