CaptureMouse/CaptureStylus 可能会失败
在 WPF 中,如果我们要做拖动效果,通常会调用一下 CaptureMouse
/CaptureStylus
以便当鼠标或手指离开控件的时候依然能够响应 Move
和 Up
事件。不知有没有注意到这两个函数其实是有 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
之前可以进行预判。
从这段代码可以很清楚地知道,如果元素已不可见 (IsVisible
为 false
) 或者不可用(IsEnabled
为 false
),则不可 Capture
。
以此为线索,果然发现调试的项目中在 MouseDown
事件里把元素隐藏了。
总结:
- 如果元素不可见或不可用,则
Mouse.Capture
会失败。
顺便还发现一个问题,Stylus.Capture(IInputElement)
中居然直接调用的是 Mouse.Capture(IInputElement)
。
CaptureMouse/CaptureStylus 可能会失败的更多相关文章
- Dll中的方法向外返回dynamic类型可能会失败
如果Dll中有某个类的方法返回dynamic实例,并且dynamic对象实际实例为匿名类类型,则Dll的外部使用者可能最终无法正常使用此dynamic对象.当使用此dynamic对象时,可能会遇到x属 ...
- 我遇到的WPF的坑
转自 林德熙Blog 本文:我遇到的WPF的坑 目录 单例应用在多实例用户无法使用 标记方法被使用 当鼠标滑过一个被禁用的元素时,让ToolTip 显示 获取设备屏幕数量 获取当前域用户 绑定资源文件 ...
- 2019-8-28-WPF-开发
title author date CreateTime categories WPF 开发 lindexi 2019-8-28 11:3:39 +0800 2018-2-13 17:23:3 +08 ...
- REDIS持久化报错失败
redis log报错: [7666] 15 Jan 00:22:36.028 # Error moving temp DB file on the final destination: Invali ...
- 在Xcode 6 beta里编译Cocos2d-x iOS项目时失败
转载 在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwr ...
- C++ new失败的处理
我们都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的.但是,如果你简单地 ...
- 解决安装失败的 Internet Explorer 11
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成.微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章.然而由机器翻译的文章并不总是完美的.它 ...
- Ubuntu-linux云服务器下安装开启虚拟环境失败解决办法
为什么要安装虚拟环境? 1.某些项目需要安装旧的包,开发相应功能 2.项目开发时,安装部分环境不希望影响整机环境 如何安装? 首先安装python 安装pip工具 sudo apt-get insta ...
- LoadLibrary 失败的解决
工作中遇到调用Loadlibrary 偶发失败的问题,不是必现,而且这种错误只是在程序初始化的时候出现,初始化成功后当然不会调用,而初始化也不是经常做的动作,所以查找原因起来比较麻烦,调试过程中发现有 ...
随机推荐
- tp5搭建1
1.首先在wamp环境根目录下创建文件夹resource. 2.利用composer下载tp5框架 怎么利用composer下载tp5框架 根据tp5完全开发手册,composer下载你的tp5框架 ...
- 解决httpclient因为保持永久长连接造成连接吊死的问题
httpclient使用了连接池,如果没有设置keep-alive策略,PoolingHttpClientConnectionManager会默认使用永久连接. 最近在调用京东api时,发现一个请求开 ...
- 配置Eclipse可以查看JDK类库源码
一.配置方法 配置Eclipse可以查看JDK类库源码 Window->Preferences->Java->Installed JREs 若没有JRE,需要自己添加进来,有的话,点 ...
- vim编程技巧
1, :E 浏览目录 如果你要改变当前浏览的目录,或是查看当前浏览的目录,你可以使用和shell一样的命令: :cd <dir> – 改变当前目录 :pwd - 查看当前目录 2, :l ...
- C++(二十九) — new 和 delete
1.基本用法,定义变量.数组.对象 class test { public: test(int a_, int b_) { a = a_; b = b_; cout << "构造 ...
- hdu1520树形dp第一题
判断最大的欢喜值,如果上司来了,直系下属就不来 如果子节点j不来那么dp[i][1]+=dp[j][0];如果子节点j来那么dp[i][0]+=max(dp[j][0],dp[j][1]);//因为j ...
- [java]BoneCP 参数详解
BoneCP 参数详解: ======================================== 一.BoneCP配置文件格式(bonecp-config.xml): xml versio ...
- 二十三 Python分布式爬虫打造搜索引擎Scrapy精讲—craw母版l创建自动爬虫文件—以及 scrapy item loader机制
用命令创建自动爬虫文件 创建爬虫文件是根据scrapy的母版来创建爬虫文件的 scrapy genspider -l 查看scrapy创建爬虫文件可用的母版 Available templates: ...
- L160
In the Soviet Union several cases have been reported recently of people whocan read and detect colou ...
- Linux之FTP服务
一.ftp服务 ftp是一个文件传输协议(File Transfer Protocal).lftp相当于一个浏览器,用来向服务器发送请求的. 进行FTP服务的相关操作的时候,要先修改 vim /et ...