在 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)

最新文章

  1. Reverse-Daily(5)-RE_100
  2. 汽车4S店经验指标完成情况报表制作分享
  3. Ext treelist 动态切换TreeStore
  4. centos6.6 设置静态网络
  5. Android防止内存泄漏以及MAT的使用
  6. SRAM与SDRAM的比较(转)
  7. C++ 在dynamic_cast<>用法
  8. 调试MVC项目,不关闭 IIS EXPRESS
  9. threading多线程总结
  10. 解决iframe在移动端(主要iPhone)上的问题
  11. Java集合-ArrayList源码解析-JDK1.8
  12. Tomcat8.0.11优化相关
  13. [BZOJ 3745] [COCI 2015] Norma
  14. PV、UV、IP、TPS、QPS、RPS、两天、吞吐量、 并发用户数 术语
  15. LINUX文件及目录管理命令基础(2)
  16. python列表常用内建方法
  17. maven多环境参数配置
  18. 【实践练习一】Git以及Github的使用
  19. mysql复杂查询
  20. centos7安装的mysql无法启动(mysql daemon failed to start)

热门文章

  1. Elasticsearch 使用技巧笔记
  2. string与位运算
  3. 初学Selenium遇到的那些坑
  4. html合并单元格
  5. Eclipse创建Maven聚合项目
  6. POJ 3167 Cow Pattern ★(KMP好题)
  7. python:使用itchat实现手机控制电脑
  8. 初次学习AngularJS
  9. C#中使用GUID
  10. jQuery动画与特效