Visual Layer Overview(5)Hit Testing in the Visual Layer

翻译 2006年06月13日 00:49:00
Hit Testing in the Visual Layer
 
这部分介绍了Windows Presentation Foundation中visual layer.使用VisualTreeHelper class来完成Hit Test的功能。这意味着你可以确定一个geometry 或者point是否落到一个visual object的边界之内,使你实现UI的行为,例如drag and drop。
 
1. Hit Testing Scenarios
UIElement class提供了InputHitTest方法,使你能够使用给定的元素的坐标值来做Hit Test。在大多数的情况下,InputHitTest方法提供了元素所需的Hit Test功能,但是,在visual layer的Hit Test时,还有一些情形需要你来实现:
     与non-UIElement objects的Hit Test。例如:DrawingVisual objects
     与geometry of objects的Hit Test:需要实现与几何体而不是坐标的Hit Test
     与多个 objects的Hit Test
     忽略UIElement hit testing 策略
 
2. Hit Testing Support
VisualTreeHelper class的HitTest的目的就是确定一个几何体或者点的坐标是否在一个给定的对象的边界内,例如control 或者graphic element。例如:可以使用Hit Test来确定鼠标点击的矩形边界是否在一个圆形对象之内。还可以override默认的Hit Test的实现来执行自定义的Hit Test计算。
下图显示了一个非矩形对象和它的矩形边界:
 
3. Hit Testing and Z-Order
Windows Presentation Foundation visual layer在所有的z-order levels支持对象的Hit Test。
在下图中,圆形对象在矩形和三角对象的上面。如果只对最上面的对象的碰撞感兴趣,可以设定Hit Test在最上面的对象停止,虽然制定的坐标包含在下面的两层对象之内。
 如果想不管z-order,枚举坐标所有的对象包含的所有的对象,可以设定返回所有的对象
 
4. Event Handling for Hit Testing
一个捕捉碰撞事件的通用的技术就是在感兴趣的所有对象上覆盖一个透明的轻量的UIElement 对象。透明的UIElement 对象虽然是不可见的,但是可以捕获事件,例如:鼠标点击。
下图显示了透明的UIElement 对象和感兴趣的其他对象的关系
 
5. Using Default Hit Testing
可以使用HitTest方法指定一个visual object和一个点坐标来确定一个点是否在一个可视化的对象之内
下面的代码显示了怎么给设UIElement定鼠标事件处理
C#
// Respond to the left mouse button down event by initiating the hit test.
 
public void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    // Retrieve the coordinate of the mouse position.
    Point pt = e.GetPosition((UIElement)sender);
 
    // Perform the hit test against a given portion of the visual object tree.
    HitTestResult result = VisualTreeHelper.HitTest(myCanvas, pt);
 
    if (result != null)
    {
        // Perform action on hit visual object.
    }
}
 
6. Using a Hit Test Result Callback
    VisualTreeHelper.HitTest(myCanvas, null,
        new HitTestResultCallback(MyHitTestResult),
        new PointHitTestParameters(pt));
 
7. Using a Hit Test Filter Callback
 VisualTreeHelper.HitTest(myCanvas,
                      new HitTestFilterCallback(MyHitTestFilter),
                      new HitTestResultCallback(MyHitTestResult),
                      new PointHitTestParameters(pt));
 
8. Overriding Default Hit Testing
可以通过override HitTestCore 方法override一个visual object的默认的Hit Test行为,这意味着当你调用HitTest 方法时,你的重载的HitTestCore 方法将被调用
// Override default hit test support in visual object.
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
    Point pt = hitTestParameters.HitPoint;
 
    // Perform custom actions during the hit test processing.
 
    // Return hit on bounding rectangle of visual object.
    return new PointHitTestResult(this, pt);
}

相关文章推荐

multi_layer_AHB_overview.pdf

  • 2009年10月10日 08:56
  • 125KB
  • 下载

Presentation Layer Testing Framework

HtmlUnit Selenium HtmlUnit The general pattern with HtmlUnit is to get a page, find the eleme...

ET 在low layer testing中的应用

以往的ET,更多是在ST的执行过程中开展的,往往基于基于UI或用户可操作的命令行接口。那么是不是只限于此呢?对于low layer testing 是否能做ET?...

Hand to hand teach you load testing web site use Visual studio.

This topic won't talk something about tech or any details about load testing, just like a guideline,...

Google Maps Layer in ArcGIS JS API

  • 2010年11月05日 22:10
  • 11KB
  • 下载

Open question when load testing web site use Visual studio.

1.       When run all the case on remote controller and agent, always got the failed. Exception     ...

layer 3 in the GSM/GPRS/LTE

经常从一些文档中看见类似 这样的描述 , layer 3 的 消息流程, layer 3的 MM ,RR,CC 。 那么layer 3 这一层到底是啥。。。为啥 会去包括 MM,RR,CC?    ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Visual Layer Overview(5)Hit Testing in the Visual Layer
举报原因:
原因补充:

(最多只允许输入30个字)