【问题标题】:Button Click Not Recognized on Canvas按钮单击在画布上无法识别
【发布时间】:2011-11-02 01:00:36
【问题描述】:

您好,我有以下代码,我正在使用按钮模板在画布上绘制一个按钮,当我单击该按钮时,我希望显示一条消息,但即使我按下鼠标,它也不会显示按钮上的事件仍然无法识别。

 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>

【问题讨论】:

  • @Meleak :我想我误删了Meleak的答案,你能重新发布吗?
  • 呵呵不是,是我删的。我认为这是常见的 Background is null 问题,但在仔细查看您的代码后,我注意到您已经拥有Background="Transparent" 所以答案没用:)
  • @Meleak :背景对于画布来说是透明的,但是按钮有一个填充并且没有背景属性,你知道背景和填充有什么区别吗?但是 Ellipse 没有 Background 属性。
  • Fill 是在 Shape 上定义的,因此从 Shape 继承的每个控件都有一个 Fill 属性。形状通常没有Foreground 属性,因此它不是真正的Background,因为形状本身不会在其上绘制任何内容,它只是填充:) Background 定义在ControlTextElement(也许还有其他地方)

标签: wpf events button canvas


【解决方案1】:

MouseLeftButtonDown 被标记为由 Button 处理,该事件不会到达画布,请改用PreviewMouseLeftButtonDown(因为它们使用不同的routing strategies,此事件不能被 Button 拦截,因为它是在先画布)。或者,您可以将事件 ButtonBase.Click 附加到画布,这当然只注册按钮点击。

【讨论】:

  • 如果您查看 xaml,事件处理程序在画布上,我现在必须运行,但稍后我会尝试 buttonbase.click。
  • @mihajlv:我知道它在画布上,并且事件是bubbling,但是一旦将e.Handled 设置为true,当它通过按钮时,它将不再到达画布。 PreviewMouseLeftButtonDown 另一方面是隧道,即事件首先在画布上引发,然后传播到按钮,因此无法拦截。
  • 我明白了,我在按钮上也放了相同的 MouseLeftButtonDown 事件处理程序,但它仍然没有捕捉到事件,你知道为什么会这样吗?从你上面所说的我认为按钮应该先抓住它并处理它。 ----------------------------- void button1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { MessageBox.Show("clicked"); }
  • @mihajlv:您不应该在按钮上放置任何事件,在画布上使用 **Preview**MouseLeftButtonDown,我对其进行了测试,它按预期工作。
  • 我明白你在说什么,但对上面评论中解释的工作原理有点困惑。既然这个事件正在冒泡,按钮不应该能够拦截它并处理它吗?我知道它适用于隧道方法,因为画布会首先拦截它。
猜你喜欢
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多