0

我有个问题。我有一个 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);
        }
    }
}
4

2 回答 2

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;
}
于 2012-07-19T12:37:31.520 回答
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。这会阻止其他事件处理程序(例如画布单击处理程序)触发。
于 2012-07-19T12:22:48.217 回答