用于省略号的MouseDown不起作用

时间:2012-07-19 12:05:16

标签: c# wpf wpf-controls ellipse

我有问题。我有一个Ellipse:ellipse1,它位于Canvas:canvas1中。 当我点击ellipse1时,它的填充从White变为PaleVioletRed。当我点击canvas1的另一部分时,椭圆将移动到那里。这有效。

当我再次点击ellipse1时,其填充颜色不会改变。

怎么了?

我有这个用于ellipse1的XAML代码:

<Ellipse Height="35" HorizontalAlignment="Left" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" Width="70" Fill="White" StrokeThickness="3" Canvas.Left="71" Canvas.Top="70" MouseDown="pion_alb1_md"/>

这是C#部分:

private void pion_alb1_md(object sender, EventArgs e)
{
    if (ellipse1.Fill == Brushes.White)
    {
        ellipse1.Fill = Brushes.PaleVioletRed;
    }
    else
    {
        ellipse1.Fill = Brushes.White;
    }
}

这是canvas1的XAML代码:

<Canvas Name="piese_canvas" MouseDown="mouse_down_canvas_piese" Background="#43FCFFEB">
.......
</Canvas>

...这里是canvas1的C#部分:

private void mouse_down_canvas_piese(object sender, EventArgs e)
{
    if (ellipse1.Fill == Brushes.PaleVioletRed)
    {            
        Point c = Mouse.GetPosition(piese_canvas);

        if ((c.X > 81) && (c.Y < 311) && (c.X <160) && (c.Y >191))
        {
            Canvas.SetLeft(ellipse1, 72);
            Canvas.SetTop(ellipse1, 241);
            ellipse1.Fill = Brushes.White;
            Canvas.SetLeft(ellipse5, -12);
            Canvas.SetTop(ellipse5, 241);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如下所示更改椭圆鼠标向下手柄。如果你没有设置e.Handled = true,画布也会处理鼠标事件,之后会立即调用mouse_down_canvas_piese。由于移动椭圆几乎完全位于“活动区域”后,Fill将重置为White

你可以通过调试找到它。另请注意,您的椭圆将永远不会移动到其他位置,因为新的TopLeft值已硬编码为241和72.

private void pion_alb1_md(object sender, RoutedEventArgs e)
{
    if (ellipse1.Fill == Brushes.White)
    {
        ellipse1.Fill = Brushes.PaleVioletRed;
    }
    else
    {
        ellipse1.Fill = Brushes.White;
    }
    e.Handled = true;
}

答案 1 :(得分:1)

我已将您的代码复制到新项目中,其工作方式与您的描述不同。

当我点击椭圆时,它会改变颜色。当我单击画布时,行if ((c.X > 81) && (c.Y < 311) && (c.X < 160) && (c.Y > 191))返回false,因此椭圆永远不会移动。这可能是因为我在窗口上的所有内容都是一个包含椭圆的画布,并且画布没有设置位置。

所以我无法重现你的问题。您能否提供有关画布或窗口中的内容的更多信息?

修改

好的,我现在看到了问题。尝试在两个方法中添加断点。对椭圆的任何点击也由画布处理(WPF路由事件的一部分)。当椭圆移动时,对它的任何点击都在画布的特殊区域的边界内,因此它被更改为PaleVioletRed(因为点击了椭圆)然后立即更改为白色(因为右侧单击了画布)位)。

尝试将椭圆点击处理程序更改为:

private void pion_alb1_md(object sender, RoutedEventArgs e)
{
    if (ellipse1.Fill == Brushes.White)
    {
        ellipse1.Fill = Brushes.PaleVioletRed;
    }
    else
    {
        ellipse1.Fill = Brushes.White;
    }
    e.Handled = true;
}

关键点是:

  • EventArgs现在是RoutedEventArgs。这暴露了IsHandled属性......
  • e.IsHandled = true。这会阻止其他事件处理程序(例如画布点击处理程序)触发。