2011-08-23 29 views
0

嗨,我有以下代碼,我正在用按鈕模板在畫布上繪製一個按鈕,當我單擊按鈕時我希望顯示一條消息,但它不,甚至當我在按鈕上註冊鼠標按下事件時,它仍然無法識別。按鈕單擊無法在畫布上識別

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 

     Button r = e.Source as Button; 
     if (r != null) 
      MessageBox.Show(r.ToString()); 

     Point mousePoint = Mouse.GetPosition(mainCanvas); 
     Button button1 = new Button(); 


     button1.Template = (ControlTemplate)this.FindResource("nodeTemplate"); 
     Canvas.SetTop(button1, mousePoint.Y); 
     Canvas.SetLeft(button1, mousePoint.X); 
     mainCanvas.Children.Add(button1); 


    } 
} 

<Window.Resources> 
    <ControlTemplate x:Key="nodeTemplate" TargetType="Button"> 
     <Grid> 
      <Ellipse x:Name="outerCircle" Fill="Red" Height="50" Width="50"/> 
      <Ellipse x:Name="innerCircle" Fill="Green" RenderTransformOrigin=".5,.5"> 
       <Ellipse.RenderTransform> 
        <ScaleTransform ScaleX=".9" ScaleY=".9"/> 
       </Ellipse.RenderTransform>  
      </Ellipse> 
     </Grid>    

    </ControlTemplate> 
</Window.Resources> 

<DockPanel> 
    <Canvas x:Name="mainCanvas" Background="Transparent" MouseLeftButtonDown="Canvas_MouseLeftButtonDown"> 

    </Canvas> 
</DockPanel> 
+0

@Meleak:我想我錯誤地刪除了Meleak的回答,你能轉發嗎? – mihajlv

+0

呵呵不,這是我刪除它。我認爲這是共同的背景是空的問題,但更仔細地看你的代碼後,我注意到你已經有'背景=「透明」'所以答案沒用:) –

+0

@Meleak:背景是透明的畫布雖然,按鈕有一個填充和沒有背景屬性,你知道背景和填充之間的區別是什麼。 但Ellipse沒有Background屬性。 – mihajlv

回答

1

MouseLeftButtonDown被打上了按鈕的處理,該事件將不會到達畫布,使用PreviewMouseLeftButtonDown代替(因爲他們有不同routing strategies這個事件不能由按鈕,因爲它被截獲首先在畫布上提出)。或者,您可以將事件ButtonBase.Click附加到畫布上,這當然只會註冊按鈕單擊。

+0

如果你在xaml中查看事件處理函數,那麼我必須現在運行,但是稍後我會嘗試buttonbase.click。 – mihajlv

+0

@mihajlv:我知道它在畫布上,事件是[bubbling](http://msdn.microsoft.com/en-us/library/ms742806.aspx#routing_strategies),但只要'e。 Handled'在通過按鈕時被設置爲「true」,它將不再到達畫布。另一方面,'PreviewMouseLeftButtonDown'是隧道,即事件首先在畫布上產生,然後傳播到按鈕,因此它不能被截取。 –

+0

我看到了,我也在按鈕上放了同樣的MouseLeftButtonDown事件處理函數,但它仍然沒有捕獲事件,你知道爲什麼這樣嗎?從你上面說的,我認爲按鈕應該先抓住並處理它。 ----------------------------- 'void button1_MouseLeftButtonDown(object sender,MouseButtonEventArgs e) { MessageBox.Show(「clicked 「); } ' – mihajlv