我有问题。我有一个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);
}
}
}
答案 0 :(得分:2)
如下所示更改椭圆鼠标向下手柄。如果你没有设置e.Handled = true
,画布也会处理鼠标事件,之后会立即调用mouse_down_canvas_piese
。由于移动椭圆几乎完全位于“活动区域”后,Fill
将重置为White
。
你可以通过调试找到它。另请注意,您的椭圆将永远不会移动到其他位置,因为新的Top
和Left
值已硬编码为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;
}
关键点是: