2011-07-16 75 views
2

爲什麼我的Canvas上的MouseLeftButtonUp不會在我的WPF應用程序中激活? 這裏是XAML:爲什麼不在WPF中觸發MouseLeftButtonUp?

<Grid Height="300" Width="400"> 
    <Canvas Name="canvas" MouseMove="canvas_MouseMove" MouseLeftButtonUp="canvas_MouseLeftButtonUp" Background="LightGray"/> 
</Grid> 

,代碼:

private bool hasClicked = false; 

    public Window1() 
    { 
     InitializeComponent(); 
    } 

    private void canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (!this.hasClicked) 
     { 
      this.Cursor = Cursors.None; 
      this.canvas.Children.Clear(); 
      this.insertRectangle(false); 
     } 
    } 

    private void insertRectangle(bool filled) 
    { 
     Rectangle rect = createRect(filled); 
     Point pos = Mouse.GetPosition(this.canvas); 
     Canvas.SetLeft(rect, pos.X); 
     Canvas.SetTop(rect, pos.Y); 
     this.canvas.Children.Add(rect); 
    } 

    private Rectangle createRect(bool fill) 
    { 
     Rectangle rect = new Rectangle(); 
     rect.Height = 50; 
     rect.Width = 120; 
     if (fill) 
     { 
      rect.Fill = new SolidColorBrush(Colors.Green); 
     } 
     else 
     { 
      rect.Stroke = new SolidColorBrush(Colors.Green); 
     } 
     return rect; 
    } 

    private void canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     this.hasClicked = true; 
     this.insertRectangle(true); 
     this.Cursor = Cursors.Arrow; 
    } 

編輯:我曾嘗試添加背景色設爲畫布,但仍事件不會觸發。看起來MouseMove以某種方式覆蓋了MouseLeftButtonUp。

Edit2:如果我刪除MouseMove事件,mouseLeftButtonUp將會觸發。

Edit3:更大的代碼示例。 在insertRectangle方法,如果我用

Canvas.SetTop(rect, 50); 
instead of 
Canvas.SetTop(rect, pos.Y); 

事件火災就好了。

+0

你的代碼對我來說不是問題。這兩起事件都被解僱了。 –

回答

0

通過不清除畫布上,而是移動預覽矩形鼠標移動的方法解決了這個問題。

3

如果您沒有在畫布上設置Background,它似乎沒有注意到您的鼠標事件。

嘗試:

<Grid> 
    <Canvas Name="canvas" 
      MouseMove="canvas_MouseMove" 
      MouseLeftButtonUp="canvas_MouseLeftButtonUp" 
      Background="White" /> 
</Grid> 
+0

它不能解決它。似乎mouseMove以某種方式干擾了該事件。 – eflles

+0

@eflles:你的網格有任何大小嗎? –

+0

是的。網格的大小爲 – eflles

相關問題