Wpf 在画布上无法识别按钮单击

Wpf 在画布上无法识别按钮单击,wpf,events,button,canvas,Wpf,Events,Button,Canvas,嗨,我有下面的代码,我在画布上用一个按钮模板画一个按钮,当我点击按钮时,我想显示一条消息,但它没有,即使我在按钮上注册了鼠标按下事件,它仍然无法识别 private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Button r = e.Source as Button; if (r != null) MessageBox.S

嗨,我有下面的代码,我在画布上用一个按钮模板画一个按钮,当我点击按钮时,我想显示一条消息,但它没有,即使我在按钮上注册了鼠标按下事件,它仍然无法识别

 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);


    }
}



MouseLeftButtonDown
标记为由按钮处理,事件将不会到达画布,请改用
PreviewMouseLeftButtonDown
(因为它们使用不同的方法,按钮无法截获此事件,因为它首先在画布上引发)。或者,您可以将事件
按钮库附加。单击画布上的
,这当然只会记录按钮的单击。

@Meleak:我想我错删除了Meleak的答案,您能重新发布吗。呵呵,不,是我删除的。我认为这是常见的背景为空的问题,但在仔细查看代码后,我注意到您已经有了
Background=“Transparent”
,因此答案是无用的:)@Meleak:Background对于画布是透明的,按钮有填充,没有Background属性,你知道背景和填充的区别吗。但椭圆没有背景属性。填充是在形状上定义的,因此从
Shape
继承的每个控件都有
Fill
属性。形状通常没有
前景
属性,因此它实际上不是
背景
,因为形状本身不会在其上绘制任何东西,它只是填充:)
背景
控件和
文本元素
上定义(也可能在其他地方)事件处理程序在画布上如果您查看xaml,我现在必须运行,但我会尝试buttonbase。稍后单击。@mihajlv:我知道它在画布上,并且事件在画布上,但是一旦
e.Handled
设置为
true
时,它将不再到达画布
PreviewMouseLeftButtonDown
另一方面是隧道,即事件首先在画布上引发,然后传播到按钮,因此它无法被拦截。我知道,我也在按钮上放置了相同的MouseLeftButtonDown事件处理程序,但它仍然无法捕获事件,你知道为什么会这样吗?根据你上面所说的,我认为这个按钮应该先抓住它并处理它
void button1_MouseLeftButtonDown(对象发送者,MouseButtonEventArgs e){MessageBox.Show(“单击”)}
@mihajlv:您不应该在按钮上放置任何事件,请使用画布上的**
预览
***
MouseLeftButtonDown
,我测试了它,它按预期工作。我理解你所说的,但对于上面评论中解释的它是如何工作的,我有点困惑。既然这个事件正在冒泡,按钮难道不能先拦截它并处理它吗?我知道它将与隧道方法一起工作,因为画布将首先拦截它。
<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>