tonyqus.cn

2008貌似是个灾年
随笔 - 201, 文章 - 1, 评论 - 1196, 引用 - 56
数据加载中……

Silverlight 2.0 命中测试(HitTest)

对于某个对象的点击事件,我们可以通过Click、MouseLeftButtonUp、MouseLeftButtonDown来捕获,但是如果有几十个、甚至几百个这样的对象需要判断是否被点击,可能你就会觉得很不爽,因为你要添加同样数量的Button_Click或者MouseDown、MouseUp事件处理程序,更不用说有控件重叠的情况了(两个控件甚至有可能重合)。

Silverlight 2.0在这方面做了改进,引入了WPF的HitTest方法。使用起来还是比较简单的。例如,我们有一个Canvas叫做LayoutRoot(Canvas根元素),那么我们就可以使用下面的代码:

IEnumerable<UIElement> elements=LayoutRoot.HitTest(mousePt);

foreach(UIElement element in elements)
{

FrameworkElement fe=element as FrameworkElement;

...

}

这里的mousePt为鼠标的当前坐标,我想明眼人已经看出来了,这段代码是写在MouseDown或者MouseUp事件处理程序中的,你可以把它直接写在Root Canvas的MouseDown或MouseUp事件中,这样可以保证能够捕获并判断所有的鼠标点击事件,当然如果有其他需求,可以单独写在某个特定的容器元素的MouseDown或MouseUp中。

为了方便大家更好的理解HitTest,我写了一个小的sample,只要你的鼠标点击位置处存在Rectangle,下面的TextBlock就会把相应的Rectangle的Name显示出来。该代码在VS2008和Expression Blend 2.5 march preview下编译通过。

下载地址为http://files.cnblogs.com/tonyqus/Silverlight2HitTest.rar

Tag标签: Silverlight,hittest

posted on 2008-04-07 11:20 Tony Qu 阅读(1832) 评论(9)  编辑 收藏 所属分类: Silverlight

评论

#1楼    回复  引用  查看    

1.HitTest其实很容易,用Rectangle.Contain(Point)就可以,这是原本的.NET就能做到的。

2.Silverlight拥有和WPF类似的事件路由模型,因此如果你说鼠标事件的话,是会自动路由的。
2008-04-07 11:28 | Cat Chen      

#2楼    回复  引用  查看    

这招不错,学习.
2008-04-07 11:36 | 笑煞天      

#3楼    回复  引用  查看    

跟作者有关的书还真不少,哈

#4楼    回复  引用  查看    

弱弱地请求,能不能压成zip……
2008-04-07 13:39 | 装配脑袋      

#5楼    回复  引用  查看    

这个方法确实不错,以前我把click事件里的sender获得然后判断到底是谁触发的,也就是让这些按钮或者矩形区域click都委托到同一个方法,现在想想这个方法好傻.
2008-04-07 13:46 | aspnetx      

#6楼    回复  引用  查看    

up :-)
2008-04-07 19:05 | Justin      

#7楼    回复  引用  查看    

点碰撞方便. 形状和形状之间的碰撞就稍微复杂了些.
2008-04-08 10:36 | nasa