2012-07-19 53 views
0

我遇到問題。我有一個位於Canvas:canvas1中的Ellipse:ellipse1。 當我點擊ellipse1時,它的填充從白色變成了PaleVioletRed。當我點擊canvas1的另一部分時,橢圓將移動到那裏。這工作。Ellipse的MouseDown不起作用

當我再次單擊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

更改橢圓形鼠標向下像下面的句柄。如果您未設置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; 
} 
+0

啊,我沒有看到這個!哎呦。 – 2012-07-19 13:03:13

1

我複製你的代碼到一個新的項目,它的工作方式不同,以你的描述。

當我點擊橢圓時,它會改變顏色。當我點擊畫布時,線條if ((c.X > 81) && (c.Y < 311) && (c.X < 160) && (c.Y > 191))返回false,橢圓不會移動。這可能是因爲我在窗口上的所有內容都是一個畫着橢圓的畫布,畫布沒有設置位置。

所以我不能重新創建你的問題。你能提供更多關於畫布或窗口內容的信息嗎?

編輯:

OK,我現在看到的問題。嘗試添加斷點到你的兩個方法。任何對橢圓的點擊也都由畫布處理(WPFs路由事件的一部分)。當橢圓移動時,任何點擊都在畫布特殊區域的邊界內,因此它會更改爲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。這會阻止其他事件處理程序(例如畫布點擊處理程序)發射。
+0

只需點擊右側位置。儘管這是一個很小的領域。 – Clemens 2012-07-19 12:33:42