Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用UserControl进行WPF测试_.net_Wpf_Hittest - Fatal编程技术网

.net 使用UserControl进行WPF测试

.net 使用UserControl进行WPF测试,.net,wpf,hittest,.net,Wpf,Hittest,我有以下UIElement树分类法: <Canvas> <UserControl x:Name="A"> <Ellipse ></Ellipse> </UserControl> <UserControl x:Name="B"> <Ellipse></Ellipse> </UserControl> <UserCon

我有以下UIElement树分类法:

<Canvas>
    <UserControl x:Name="A">
        <Ellipse ></Ellipse>
    </UserControl>
    <UserControl x:Name="B">
        <Ellipse></Ellipse>
    </UserControl>
    <UserControl x:Name="C">
        <Ellipse></Ellipse>
    </UserControl>
</Canvas>

目前,椭圆的高度和宽度占据整个画布,但其背景是透明的。椭圆可以在屏幕上拖动。我想做的是执行命中测试,以便

  • 当一个椭圆上发生抽头时,可以独立识别椭圆

  • 椭圆可以自由拖动(这就是为什么高度/宽度占据整个画布的原因)


  • 我确实阅读了HitTest文档,但我仍然感到困惑。有人能为我提供一些完成上述任务的指导吗?在iOS中,它只是覆盖pointInside:检查位置是否在UserControl上的省略号内

    以下链接可帮助您完成您想要完成的任务


    如果要确定单击了哪些子项,可以将PreviewMouse放在父项上,并检查e.OriginalSource中的子项。如果要覆盖控件,则可以覆盖Previewmousedown函数,以了解单击了哪些子项。

    因此,如果有人遇到相同的问题,我将在NULL和透明之间切换背景。这是一种黑客行为,但WPF路由(是的,我很讨厌)是一个非常头痛的问题。我以后可能会遇到性能问题(可能不会),但我可以避免遍历树。

    这有帮助吗

    void UserControl_PreviewMouseDown(object sender, MouseButtonEventArgs e) {
        ...
        if (VisualTreeHelper.HitTest(ellipse, e.GetPosition(ellipse)) != null) {
            // mouse is within ellipse
        }
    }
    

    顺便说一下,
    UserControl
    可能会给您带来麻烦。请看下面的解释:

    UserControl类更改路由事件的源。当事件发生时 从用户控件内部的控件到元素的气泡或通道 在用户控件之外,源更改为指向用户 控件而不是原始元素。这会给你更多 封装。(例如,如果您处理 保存的布局容器中的UIElement.MouseLeftButtonDown事件 在颜色选择器中,单击矩形时将收到一个事件 但是,此事件的源不会是矩形 元素,但包含矩形的ColorPicker对象。如果 创建与普通内容控件相同的颜色选择器,如下所示 是不是由你来拦截你控制的事件, 处理它,然后重新提升它。)


    此行为是
    UserControl
    独有的。基本上,这意味着将元素分组在一起,就像它们是单个元素一样。它的主要用例是使用XAML/“代码隐藏”duo创建派生控件。对于独立容器,最好使用普通的。

    使用
    拇指
    控件。你不需要任何定制的HitTesting。我会看看Thumb控件,但是我的UserControl相当复杂。你能多了解一下那个控件的用法吗?