首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CaptureMouse/CaptureStylus 可能会失败

CaptureMouse/CaptureStylus 可能会失败

作者头像
walterlv
发布2018-09-18 15:59:02
5520
发布2018-09-18 15:59:02
举报

CaptureMouse/CaptureStylus 可能会失败

2017-10-09 11:05

了解 Mouse.Capture 和 Stylus.Capture 方法的调用可能返回 false,了解其返回 false 的原因。

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

本文会经常更新,请阅读原文: https://walterlv.com/post/wpf/capture-mouse-failed.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CaptureMouse/CaptureStylus 可能会失败
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档