2011-08-17 132 views
0

我有一个这样的网格:捕获鼠标事件

<Grid> 
     <WrapPanel Name="wrap1"/> 
     <Canvas Name="canvas1" Background="LightGray" Opacity="0.5"/>  
    </Grid> 

而且我希望能够:

  • 捕获点击事件为WrapPanel按钮
  • 捕获的MouseLeftButtonDown,的MouseLeftButtonUp ,鼠标移动事件帆布

WrapPanel按钮PreviewMouseLeftButtonDown和Click不起作用。将Canvas放入Canvas内部的WrapPanel或WrapPanel也不起作用。

回答

1

您的WrapPanel和Canvas不在VisualTree中的父/子关系中。 WrapPanel不包含Canvas,所以鼠标事件不会冒泡。您需要在WrapPanel中包含Canvas,然后这两个事件都可以使用。

编辑:

这是我的代码触发这两个事件(I也势必我的帆布宽度/高度与含WrapPanel因此将填充面板):

<WrapPanel Name="wrap1" MouseLeftButtonDown="wrap1_MouseLeftButtonDown"> 
    <Canvas Name="canvas1" 
     Width="{Binding ElementName=wrap1, Path=ActualWidth}" 
     Height="{Binding ElementName=wrap1, Path=ActualHeight}" 
     Background="LightGray" Opacity="0.5" 
     MouseLeftButtonDown="canvas1_MouseLeftButtonDown"/> 
</WrapPanel> 

Remeber该预览事件在VisualTree中自顶向下,其中非预览事件是自下而上的,所以如果使用预览事件,则WrapPanel事件将首先触发,但此代码将首先触发Canvas事件。

+0

如果我这样做画布,不要获得任何鼠标输入。 – Cobold

+0

我测试了这个,它工作正常,你需要确保你的画布有一个大小设置,因为deafult它不会strech来填充WrapPanel。 –

0

编辑:你应该附加到你的WrapPanel中的每个按钮的点击事件。如果它们是动态添加的,请在将事件添加到包装面板之前附加事件。

+0

对不起。我误解了你的问题。您应该附加到WrapPanel中每个按钮的点击事件。如果它们是动态添加的,请在将事件添加到包装面板之前附加事件。 – Tejs

+0

我已经在动态地做这件事。 – Cobold