WPF-MouseDown&MouseUp事件触发无效解决方法

WPF-MouseDown&MouseUp事件触发无效解决方法

由于微软的一些迷之bug,像click事件一样直接在事件中生成的方法无法触发,包括MouseLeftButtonDown等,必须采取手动方法:

1.新建路由事件:

private void bt_MouseDown(object sender, RoutedEventArgs e)
{
    //bilibili
}

2.在初始化函数中加入路由委托:

ResetButton.AddHandler(Button.MouseDownEvent, new RoutedEventHandler(bt_MouseDown), true);

这样两步就可以实现功能了。

WPF开发中,长按鼠标时`MouseUp`事件触发,有以下两种解决方案: ### 方案一:跳过`MouseUp`事件,动画开始后启动线程监控系统的鼠标状态 此方案通过启动一个线程来监控系统的鼠标状态,绕过了`MouseUp`事件触发问题。示例代码如下: ```csharp Thread animation; private void operateOilPump_MouseDown(object sender, MouseButtonEventArgs e) { animation = new Thread(StartAnimation); animation.IsBackground = true; animation.Start(); } [DllImport("user32.dll")] static extern short GetAsyncKeyState(int nVirtKey); private void StartAnimation() { while (true) { if (GetAsyncKeyState(0x01) != 0) { // 动画执行程序 } else { // 判断按钮长按时间是否达到,若达到设定时间,则执行按钮功能函数 } Thread.Sleep(20); } } ``` 在上述代码中,`operateOilPump_MouseDown`方法在鼠标按下时启动一个新线程`StartAnimation`。`StartAnimation`方法通过`GetAsyncKeyState`函数不断检查鼠标左键的状态,根据状态执行相应的操作。 ### 方案二:解决`MouseUp`不触发的问题 可以通过使用`PreviewMouseDown`和`PreviewMouseUp`事件来替代`MouseDown`和`MouseUp`事件,示例代码如下: ```xml <Grid> <Button Content="Click Me" HorizontalAlignment="Center" VerticalAlignment="Center" MouseEnter="Button_MouseEnter" PreviewMouseDown="Button_MouseDown" PreviewMouseUp="Button_MouseUp"/> </Grid> ``` ```csharp public Window2() { InitializeComponent(); } // 当鼠标移入按钮时触发 private void Button_MouseEnter(object sender, MouseEventArgs e) { System.Diagnostics.Debug.WriteLine("鼠标移入"); // 或者如果你希望在UI中显示,可以更新TextBlock的Text属性等 } // 当鼠标按下按钮时触发(可以看作是开始点击) private void Button_MouseDown(object sender, MouseButtonEventArgs e) { System.Diagnostics.Debug.WriteLine("按钮点击(鼠标按下)"); // 注意:这里不是严格意义上的“按钮点击”,而是鼠标按下的动作 } // 当鼠标松开按钮时触发 private void Button_MouseUp(object sender, MouseButtonEventArgs e) { System.Diagnostics.Debug.WriteLine("按钮松开"); // 注意:如果你的按钮在MouseDown触发了某些操作,并希望在MouseUp时撤销或完成这些操作,请在这里处理 } ``` 在上述代码中,使用`PreviewMouseDown`和`PreviewMouseUp`事件来监控按钮的按下和松开操作,避免了`MouseUp`事件触发的问题。
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值