Silverlight中命中测试使用小技巧
时间:2010-08-16 来源:DevinShaw
在做Silverlight流程设计器中,两次用到了命中测试。主要用到了IsHitTestVisible和FindElementsInHostCoordinates。
IsHitTestVisible是UIElement类的属性,作用是是否对点击起作用。 FindElementsInHostCoordinates是VisualTreeHelper的方法,查找点或区域内的UIElement对象。
1. IsHitTestVisible的使用
场景:在两个环节之间画迁移时,我试用了动态画一条直线显示迁移的位置。在MouseLeftButtonDown事件中,记录迁移的起点。在MouseLeftButtonUp事件中得到迁移的终点,并动态添加一天迁移。而在MouseMove的过程中,我动态显示一条直线来显示迁移的位置。
问题:在终点环节中MouseLeftButtonUp事件能触发,时而不能触发。
该问题让我莫名其妙,百思不得其解。后来请假高手,方知道问题出在MouseMove时,动态画的直线上。MouseLeftButtonUp事件并没有在环节上触发,而是在那条直线上触发。因为鼠标变很小,有时相差一个像素就不在直线上而落在环节上,此时事件能正常触发。解决的办法只要给这条直线IsHitTestVisible属性赋值为false就可以了。
2. FindElementsInHostCoordinates
问题:最初实现迁移的选中和插点都是在迁移线的鼠标点击事件中完成的。迁移线太细了,要选中迁移很费力。
查找资料后发现Silverlight也有命中测试,我在迁移钱的父节点添加命中测试的判断,就可以解决问题。示意代码如下:

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