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>