我在创建的一个WPF窗体中建立了Canvas1和Canvas2,然后Canvas1的面积更大一些能完全包住Canvas2,于是我就用
<Canvas1>
<Canvas2></Canvas2>
</Canvas1>
的形式写了出来,再来给Canvas2设定了一个鼠标敲击事件,但是!试了好多次总是点N下才有一下反应,但我给Canvas1也加上这个事件的话就能次次有效.......
总结就是:用一个大的Canvas包住小的Canvas的情况下(并且保证父子级),点击小的Canvas总会被默认为是点击大的Canvas........这是为什么,本人新手刚接触WPF,求教高手!
你说的这种情况下,Canvas2是Canvas1的child,Canvas2会被认为是Canvas1的一部分,就像手是身体的一部分,我打一下你的手,这时“我打了你的身体”这个命题同时成立,就是说子控件的点击事件触发时,父控件的相应事件会被同时触发。
你断点调试一下就知道了,点击中Canvas2,Canvas1,2的事件都会被触发。
至于你说的只触发了Canvas1的事件,那一定是你没点击中Canvas2,点击到其它地方了,建议调试的时候给Canvas1,2设置不同背景颜色,这就知道到底有没有点击到Canvas2了。
另外Canvas的Background默认为Null,是点击不了的,要给Canvas设置一个背景色,才能被点击到。如果不想Canvas有背景色,又想被点击中的话,就把Canvas的Background设置为Transparent.
首先,十分感谢这么详尽的回答!其实我这情况就是我想根据网上的那些代码想自己试着写一个五子棋,木纹棋盘就是我的Canvas1,然后横竖的那些纹路组成就是我的Canvas2.代码如下:
<Canvas Height="490" Width="490" Canvas.Left="26" Canvas.Top="43" Name="ContaingobangCanvas">
<Canvas.Background>
<ImageBrush ImageSource="/LANgobangBattle;component/Image/53bOOOPICd4_1024.jpg" />(木纹图片)
</Canvas.Background>
<Canvas Height="450" Width="450" Name="gobangCanvas" Margin="20,20" MouseDown="gobangCanvas_MouseDown"></Canvas>
</Canvas>
试的时候一直都是怎么点都不管用,设置了大Canvas的敲击事件才管用,听你的方法把Background设置为Transparent瞬间就好了,太感谢了!这么看来的话WPF里的Canvas如果不设置Background的话敲击事件是不能生效的对吧
看看《WPF揭秘》这本书吧,其中有路由事件的介绍应该有帮助