2012-06-22 34 views
1

我目前正在研究一種圖像處理工具,它將包含某些選擇工具。 爲了顯示當前選擇的用戶(例如圓)三個事件被使用(所有一定畫布內):C# - WPF - 確定畫布中的鼠標位置僅適用於形狀頂部

public MainWindow() 
{   
    InitializeComponent(); 
} 

private Ellipse _ellip = new Ellipse(); 
private Point _p = new Point(); 
private bool _mouse = false; 
private double _xcor, _ycor; 

private void mouseDown(object sender, MouseButtonEventArgs e) 
{ 
    _p = Mouse.GetPosition(canvas1); 
    _xcor = _p.X; 
    _ycor = _p.Y; 
    _mouse = true; 
} 

private void newPos(object sender, MouseEventArgs e) 
{ 

    if (mouse) 
    { 
     _ellip.Visibility = Visibility.Visible; 
     _p = Mouse.GetPosition(canvas1); 
     _ellip.Margin = new Thickness((_xcor + _p.X)/2 - Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y))/2, (_ycor + _p.Y)/2 - Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y))/2, 0, 0); 
     ellip.Height = Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y)); 
     ellip.Width = Math.Sqrt((_xcor - _p.X) * (_xcor - _p.X) + (_ycor - _p.Y) * (_ycor - _p.Y)); 
    } 

    InvalidateVisual(); 
} 

private void mouseUp(object sender, MouseButtonEventArgs e) 
{ 
    mouse = false; 
    ellip.Visibility = Visibility.Hidden; 
} 

這工作的一個條件下的所有細:有某種形狀的在圈子後面。不知何故,如果在canvas1的空白區域使用MouseLeftButtonDown/Up和MouseMove事件,則不會引發。一旦我例如創建一個填充畫布的矩形,一切正常。但是這帶來了另一個問題:如果矩形大於畫布,它基本上不在畫布上,事件也在畫布外部工作(只要它在矩形的頂部)。 我真的不明白這裏出了什麼問題。

回答

1

只有在命中測試表明鼠標指針下面有「東西」的情況下,WPF才能識別鼠標按鈕操作。因此,您應該在畫布上實施HitTestCore(PointHitTestParameters)

以下說明如何覆蓋默認命中測試:http://msdn.microsoft.com/en-us/library/ms752097.aspx#overriding_default_hit_testing

+0

謝謝,我可能會用背景畫筆去。我真的沒有想到這一點。現在工作得很好! 我仍然會查找HitTestCore,感謝您的鏈接! – phil13131