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

解决方案 »

  1.   

    把需要选中的控件放最上层,鼠标点击事件只能给最上层的控件捕获,至于要传递到下层,只能自己写代码传递,WPF不会自动帮你传递。
      

  2.   

    想问下你是怎么选中大矩形的,??只能便历Canvas里面的矩形
    getPosition,
    假如大小矩形都满足条件,则2个选一个咯 
      

  3.   

    如果可以,把大矩形的IsHitVisible设置为False,这样就可以命中其下面的控件了
      

  4.   

    http://zwkufo.blog.163.com/blog/static/2588251201023145136225/?suggestedreading&wumii
      

  5.   

    从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,人为改变事件流程那么就可以达到你要的效果。