2011-08-17 170 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