WPF UIElement.IsHitTestVisible=false;还在回击吗?

2023-12-19

我从 FrameworkElement 派生一个控件以用作 VisualCollection 的容器,因为我正在使用 DrawingVisuals 进行大量自定义渲染(创建游戏地图)。

我的容器有几个不同的实例,彼此层叠,我只想命中测试影响当前可见的层,所以我尝试做明显的事情,并设置 .IsHitTestVisible=false,根据 MSDN 应该这样做防止任何子元素作为命中结果返回。

但是,我仍然收到设置 .IsHitTestVisible=false 的容器返回的命中。 我已经尝试了我能想到的所有其他方法,折叠,隐藏,禁用,0不透明度,似乎没有什么可以将其从命中测试中剔除。


我认为这是一个错误。我使用 Reflector 来理解为什么 HitTest 方法返回不可见的项目,并且我发现没有检查可见性。

我的解决方案是使用带有过滤器的重载 HitTest:

public static HitTestFilterBehavior HitTestFilterInvisible(DependencyObject potentialHitTestTarget)
{
    bool isVisible = false;
    bool isHitTestVisible = false;

    var uiElement = potentialHitTestTarget as UIElement;
    if (uiElement != null)
    {
        isVisible = uiElement.IsVisible;
        if (isVisible)
        {
            isHitTestVisible = uiElement.IsHitTestVisible;
        }
    }
    else
    {
        UIElement3D uiElement3D = potentialHitTestTarget as UIElement3D;
        if (uiElement3D != null)
        {
            isVisible = uiElement3D.IsVisible;
            if (isVisible)
            {
                isHitTestVisible = uiElement3D.IsHitTestVisible;
            }
        }
    }

    if (isVisible)
    {
        return isHitTestVisible ? HitTestFilterBehavior.Continue : HitTestFilterBehavior.ContinueSkipSelf;
    }

    return HitTestFilterBehavior.ContinueSkipSelfAndChildren;
}
...
// usage:

    VisualTreeHelper.HitTest(
        myHitTestReference,
        HitTestFilterInvisible,
        hitTestResult =>
        {
            // code to handle element which is visible to the user and enabled for hit testing.
        },
        new PointHitTestParameters(myHitTestPoint));

我希望它能帮助你

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF UIElement.IsHitTestVisible=false;还在回击吗? 的相关文章

随机推荐

  • Angular 2 中的动态模板和 templateURL

    每当我必须在页面中动态包含模板时 我就一直在 Angular 1 中使用 ng include 现在如何在 Angular 2 中实现这一点 我尝试搜索并找到了这些 https groups google com forum topic a
  • Django 选择查询时间差异

    我正在尝试查询 django 中的数据库表 其中包括以下列 id start time end time 我可以直接在查询中获取差异 而不是获取两者的单独值吗 有这样的效果 SELECT id Diff start time end tim
  • 从 shell 脚本在 Firefox 的特定实例中打开新选项卡

    我有一个 shell 脚本 可以创建 Firefox 配置文件 然后使用它们同时打开多个 Firefox 实例 问题是如何在特定的 Firefox 实例中打开 URL 我努力了 firefox CREATEPROFILE test fire
  • 如何自动启动/预热 IIS 中托管的 .net core Web 应用程序

    我有一个 net core 3 1 Web 应用程序 托管在 IIS 上 我无法弄清楚如何在第一个请求之前运行一段代码 我做了以下事情 设置应用程序池的 启动模式 AlwaysRunning 和 空闲超时 0 在网站上设置 预加载已启用 t
  • 有关 SP 和 UDF 的帮助吗?

    我正在尝试通过 MySQL 和 PHP 学习和使用 SP 存储过程 和 UDF 用户定义函数 SP和UDF有什么区别 用途是什么 一段简单的代码在 PHP 和 SQL 中会是什么样子 其中 SP 正在更新 写入或从 MySQL 数据库的表中
  • 为什么应用程序通常不使用 int 在内部表示货币值?

    为什么应用程序通常不使用整数数据类型 例如int or long在 C Java C 中 在内部表示货币值 而不是使用浮点数据类型 float double 或者类似Java的BigDecimal 例如 如果我正在编写一个 Java 应用程
  • 在移动 safari 中是否有使用 onbeforeunload 的替代方法?

    在 mobile safari 中是否有替代方法可以代替 onbeforeunload 我注意到 Google 能够捕获onbeforeunloadmobile safari 中的事件 有谁知道他们是怎么做到的吗 谷歌能够使用他们的 Gma
  • 在heroku上使用node.js开发时钟和workers

    我正在开发一项服务 需要每五分钟为不同的用户分析来自社交媒体网络的数据 我正在使用 node js 开发它 并将在 Heroku 上实现它 根据本文 https devcenter heroku com articles scheduled
  • 用于 mysql 的多个 docker 容器或一个具有多个数据库的实例

    我有一个关于使用 docker 容器的最佳实践的问题 我开发的每个应用程序都需要一个数据库 现在我的问题是我是否应该使用一个内部有多个数据库的 mysql docker 实例 还是应该为每个数据库创建一个实例 我发现为每个数据库创建一个实例
  • 网格布局内的中心列[重复]

    这个问题在这里已经有答案了 我已经开始学习网格系统 显示 网格 并且我有以下代码 但我不知道如何将最后两列 4和5 居中而不在网格模板列中添加更多列并使用网格列中的 column start 和 grid column end 是否可以 H
  • R 中逻辑回归的混淆矩阵

    我想使用我的训练数据和测试数据计算逻辑回归的两个混淆矩阵 logitMod lt glm LoanStatus B data train family binomial link logit 我将预测概率的阈值设置为 0 5 confusi
  • 枚举中定义的项目总数

    如何获取枚举中定义的项目数 您可以使用静态方法Enum GetNames https msdn microsoft com en us library system enum getnames它返回一个数组 表示枚举中所有项目的名称 该数组
  • Java 继承 - this 关键字

    我在网上搜索了类似的问题 但没有找到 所以 在这里发帖 在下面的程序中 为什么 i 的值被打印为100 AFAIK this 指的是当前对象 在本例中是 TestChild 并且类名也被正确打印 但为什么实例变量的值不是200呢 publi
  • 无论旋转如何锁定方向

    我有一个UITabBar嵌入式应用UINavigation对于一些观点 在一个特定的导航视图上 我显示图形 图表 最好将它们显示在landscape就像 iPhone 向左或向右旋转一样 该应用程序的其余部分更适合纵向 因此 我想 强制 包
  • WPF DataGrid 好的教程吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人可以向我指出互联网上优秀的 WPF DataGrid 教程吗 这些都是很好的 第二个是旧的 但仍然足够好 www wpftutoria
  • 退出命令行程序的首选方式是什么?

    这应该很简单 我只需要简单地退出我的命令行 C 程序 没有什么花哨的东西 我应该使用 Environment Exit or this Close 或者是其他东西 刚刚从Main method Edit 如果您确实失去了流程并希望从应用程序
  • 从 Elasticsearch 返回父数据和子文档

    是否可以通过在 Elasticsearch 查询中搜索子文档来返回父数据 我有两种文档类型 例如书籍和章节 作为父 子相关 非嵌套 我想对子文档运行搜索并返回子文档以及父文档中的一些字段 我试图避免对父级执行单独的查询 Update 我能找
  • 无法通过JAVA连接到HIVE2

    Referring to Hive2 https cwiki apache org confluence display Hive HiveServer2 Clients HiveServer2Clients JDBC created a
  • iPhone / iOS Facebook SDK - 您可以在应用程序内登录并保留登录凭据吗?

    是否可以使用 Facebook iOS SDK 在应用程序内进行身份验证 而不是转到 Safari 并保留这些身份验证凭据以供下次启动应用程序时使用 当我尝试在模拟器中使用演示应用程序时 它总是转到 safari 进行身份验证 这看起来有点
  • WPF UIElement.IsHitTestVisible=false;还在回击吗?

    我从 FrameworkElement 派生一个控件以用作 VisualCollection 的容器 因为我正在使用 DrawingVisuals 进行大量自定义渲染 创建游戏地图 我的容器有几个不同的实例 彼此层叠 我只想命中测试影响当前