Silverlight中命中测试使用小技巧

在做Silverlight流程设计器中,两次用到了命中测试。主要用到了IsHitTestVisible和FindElementsInHostCoordinates。

IsHitTestVisible是UIElement类的属性,作用是是否对点击起作用。  FindElementsInHostCoordinates是VisualTreeHelper的方法,查找点或区域内的UIElement对象。

1. IsHitTestVisible的使用

场景:在两个环节之间画迁移时,我试用了动态画一条直线显示迁移的位置。在MouseLeftButtonDown事件中,记录迁移的起点。在MouseLeftButtonUp事件中得到迁移的终点,并动态添加一天迁移。而在MouseMove的过程中,我动态显示一条直线来显示迁移的位置。

问题:在终点环节中MouseLeftButtonUp事件能触发,时而不能触发。

该问题让我莫名其妙,百思不得其解。后来请假高手,方知道问题出在MouseMove时,动态画的直线上。MouseLeftButtonUp事件并没有在环节上触发,而是在那条直线上触发。因为鼠标变很小,有时相差一个像素就不在直线上而落在环节上,此时事件能正常触发。解决的办法只要给这条直线IsHitTestVisible属性赋值为false就可以了。


2. FindElementsInHostCoordinates

问题:最初实现迁移的选中和插点都是在迁移线的鼠标点击事件中完成的。迁移线太细了,要选中迁移很费力。

查找资料后发现Silverlight也有命中测试,我在迁移钱的父节点添加命中测试的判断,就可以解决问题。示意代码如下:

代码
Rect clickArea = new Rect(e.GetPosition(null).X - 3, e.GetPosition(null).Y - 366);
IEnumerable
<UIElement> list = VisualTreeHelper.FindElementsInHostCoordinates(clickArea, this).Where(f => { return f is GraphicTransition; });
if(list.Count() > 0)
{
   (list.First() 
as GraphicTransition).MouseLeftDown(e);
    
return;
}


 

 FindElementsInHostCoordinates()有两个重载方法,一个是测试点的命中,一个是测试区域的命中。 我在代码中就用测试一个点击区域,看是否选中了迁移。这样就方便多了。

posted @ 2010-08-16 10:33  DevinShaw  阅读(705)  评论(0编辑  收藏  举报