C# wpf 实现Canvas内控件拖动

这篇文章描述了如何在WPF应用中处理Button的鼠标事件,包括MouseDown、MouseMove和MouseUp,实现按钮控件的拖放功能。当鼠标按下时记录位置并捕获鼠标,移动时更新按钮位置,鼠标释放时释放捕获。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

鼠标按下 释放 移动

<Button   PreviewMouseDown="Button_MouseDown" 
          PreviewMouseMove="Button_MouseMove" 
          PreviewMouseUp="Button_MouseUp"> </Button>

记录位置

//鼠标是否按下
bool _isMouseDown = false;
//鼠标按下的位置
Point _mouseDownPosition;
//鼠标按下控件的位置
Point _mouseDownControlPosition;
//鼠标按下事件
private void Button_MouseDown(object sender, MouseButtonEventArgs e)
{
    var c = sender as Control;
    _isMouseDown = true;
    _mouseDownPosition = e.GetPosition(this);
    _mouseDownControlPosition = new Point(double.IsNaN(Canvas.GetLeft(c))? 0:Canvas.GetLeft(c),double.IsNaN(Canvas.GetTop(c)) ? 0 : Canvas.GetTop(c) );
    c.CaptureMouse();
}

鼠标移动

private void Button_MouseMove(object sender, MouseEventArgs e)
{
    if (_isMouseDown)
    {
        var c = sender as Control;
        var pos = e.GetPosition(this);
        var dp = pos - _mouseDownPosition;
        Canvas.SetLeft(c, _mouseDownControlPosition.X+ dp.X);
        Canvas.SetTop(c, _mouseDownControlPosition.Y + dp.Y);
    }
}

鼠标释放

private void Button_MouseUp(object sender, MouseButtonEventArgs e)
{          
   var c = sender as Control;
   _isMouseDown = false;
   c.ReleaseMouseCapture();
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值