日期:2014-05-18  浏览次数:20930 次

WPF命中测试
初学WPF遇到一些问题,请各位高手帮忙.
我在Canvas中放了两个矩形一大一小。大矩形的透明度为0.5,小矩形为不透明。现在将大的矩形覆盖到小矩形上面,然后如何选中小矩形呢。

------解决方案--------------------
把需要选中的控件放最上层,鼠标点击事件只能给最上层的控件捕获,至于要传递到下层,只能自己写代码传递,WPF不会自动帮你传递。
------解决方案--------------------
想问下你是怎么选中大矩形的,

??

只能便历Canvas里面的矩形
getPosition,
假如大小矩形都满足条件,则2个选一个咯
------解决方案--------------------
从routed event来理解是这样的,
1. 但你在上面(ZIndex大)的那个Rectangle中点下鼠标,会触发wpf做一系列的hittest,找出满足条件的元素,可以肯定的是,只有一个,这个元素就是source
2. 从source沿visual tree一路往上达到顶层,然后触发隧道事件,即previewmousedown,首先触发root node,一般是你的window,从window,往上达到canvas,最后到达Rectangle(ZIndex大的那个)
3. 然后再从source,往上进行bubble,即冒泡事件,mousedown,从Rectangle到Canvas,最后到Window
4. 一旦中间e.handle=true,事件流中止
5. 所以在这个流程中另外一个Rectangle根本没有参与,这就是无法收到的原因
6. 在这个基础上,如果你需要让另外的Rectanglek可以收到事件通常2个思路
a. 让第一个ishittestvisible=false,不参与hittest流程,那么后一个就会被选中,不过这个可能不适用你的情况
b. 在隧道流到达Canvas时,让Canvas截获,然后遍历其Children,让每个Child做HitTest,人为改变事件流程那么就可以达到你要的效果。