2011-08-23 133 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