当前位置: 首页 > news >正文

CaptureMouse/CaptureStylus 可能会失败

在 WPF 中,如果我们要做拖动效果,通常会调用一下 CaptureMouse/CaptureStylus 以便当鼠标或手指离开控件的时候依然能够响应 MoveUp 事件。不知有没有注意到这两个函数其实是有 bool 返回值的?——是的,它们可能会失败。


在调试一个项目代码的时候,我就发现了这种失败,观察返回值确实是 false,然而为什么呢?

查看 .Net Framework 的源码 我们发现,CaptureMouse 最终调到了 Mouse.Capture 方法:

public static bool Capture(IInputElement element)
{
    return Mouse.PrimaryDevice.Capture(element);
}

然后一步步调到了 bool Capture(IInputElement element, CaptureMode captureMode),而其中对是否可 Capture 的关键性影响代码就在这个方法内部。为了便于理解,我把他改成了下面这样,是等价的:

[Pure]
private static bool CanCapture(IInputElement element)
{
    if (element is UIElement e)
    {
        return e.IsVisible && e.IsEnabled;
    }
    if (element is ContentElement ce)
    {
        return ce.IsEnabled;
    }
    if (element is UIElement3D e3D)
    {
        return e3D.IsVisible && e3D.IsEnabled;
    }
    return true;
}

这段代码感兴趣可以拿走,以便在 Capture 之前可以进行预判。

从这段代码可以很清楚地知道,如果元素已不可见 (IsVisiblefalse) 或者不可用(IsEnabledfalse),则不可 Capture

以此为线索,果然发现调试的项目中在 MouseDown 事件里把元素隐藏了。

总结:

  • 如果元素不可见或不可用,则 Mouse.Capture 会失败。

顺便还发现一个问题,Stylus.Capture(IInputElement) 中居然直接调用的是 Mouse.Capture(IInputElement)

相关文章:

  • 使用 ExceptionDispatchInfo 捕捉并重新抛出异常
  • 使用 Task.Wait()?立刻死锁(deadlock)
  • 如何实现一个可以用 await 异步等待的 Awaiter
  • WPF 同一窗口内的多线程 UI(VisualTarget)
  • WPF 和 UWP 中,不用设置 From 或 To,Storyboard 即拥有更灵活的动画控制
  • 从 “x is null 和 x == null” 的区别看 C# 7 模式匹配中常量和 null 的匹配
  • 使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用
  • WPF 跨应用程序域的 UI(Cross AppDomain UI)
  • 将 UWP 的有效像素(Effective Pixels)引入 WPF
  • 用动画的方式画出任意的路径(直线、曲线、折现)
  • 使 WPF 支持触摸板的横向滚动
  • NullReferenceException,就不应该存在!
  • 当我们使用 MVVM 模式时,我们究竟在每一层里做些什么?
  • 分享一个算法,计算能在任何背景色上清晰显示的前景色
  • WPF 绘制对齐像素的清晰显示的线条
  • 【RocksDB】TransactionDB源码分析
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • centos安装java运行环境jdk+tomcat
  • crontab执行失败的多种原因
  • Docker 笔记(2):Dockerfile
  • Laravel5.4 Queues队列学习
  • LeetCode算法系列_0891_子序列宽度之和
  • orm2 中文文档 3.1 模型属性
  • Python十分钟制作属于你自己的个性logo
  • Redis的resp协议
  • Redis学习笔记 - pipline(流水线、管道)
  • 阿里云Kubernetes容器服务上体验Knative
  • 搭建gitbook 和 访问权限认证
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 关于 Cirru Editor 存储格式
  • 回顾 Swift 多平台移植进度 #2
  • 深度学习中的信息论知识详解
  • 微信小程序--------语音识别(前端自己也能玩)
  • 无服务器化是企业 IT 架构的未来吗?
  • 一个SAP顾问在美国的这些年
  • 一个完整Java Web项目背后的密码
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​TypeScript都不会用,也敢说会前端?
  • #define与typedef区别
  • (07)Hive——窗口函数详解
  • (2)MFC+openGL单文档框架glFrame
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (四)事件系统
  • (一)u-boot-nand.bin的下载
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • *Django中的Ajax 纯js的书写样式1
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .CSS-hover 的解释
  • .md即markdown文件的基本常用编写语法
  • .Net Core和.Net Standard直观理解