2014-01-15 19 views
1

我正在學習WPF,並製作了一個簡單的程序,用鼠標繪製。我有一個帶有頂部和左側窗格的DockPanel,並且繪圖畫布佔據了剩餘的空間。當我單擊並拖動以繪製自由曲線時,線條的繪圖將被菜單佔用的空間量所抵消。我寧願不硬編碼值,因爲這些大小可能會改變。標準畫布畫布程序,由停靠的UI元素造成的偏移量。如何動態補償?

private void Canvas_MouseDown_1(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    // Console.WriteLine("Clicked"); 
    if (e.ButtonState == MouseButtonState.Pressed) 
     { 
      offset = e.GetPosition(sender as FrameworkElement); 
      Console.WriteLine("Offset: " + offset.ToString()); 
      currentPoint = e.GetPosition(this); 
     } 
} 

private void Canvas_MouseMove_1(object sender, System.Windows.Input.MouseEventArgs e) 
{ 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      Line line = new Line(); 
      line.Stroke = SystemColors.WindowFrameBrush; 
      line.X1 = currentPoint.X; 
      line.Y1 = currentPoint.Y; 
      line.X2 = e.GetPosition(this).X; 
      line.Y2 = e.GetPosition(this).Y; 

      currentPoint = e.GetPosition(this); 

      canvas.Children.Add(line); 
     } 
} 

有沒有一種方法可以直接獲取畫布元素中的點而不是整個程序窗口?如果沒有,我可以得到菜單元素的繪製寬度和繪製高度,但這看起來並不是最優雅的解決方案。

謝謝!

+0

是'e.GetPosition(發件人爲FrameworkElement的) '不正確地返回相對於'Canvas'的值?我看到你曾經使用過這種方法,但是使用'e.GetPosition(this)',否則它會返回它相對於整個'Window'(或任何'this')。 – Tim

+0

啊,我很笨。那是,但是在我將currentPoint設置爲e.GetPosition(發件人爲FrameworkElement)之前,我忘了將它複製到MouseMove函數中。 >< – Benjin

回答

2

我沒有測試過這一點,但我認爲你應該做的事情:

private void Canvas_MouseDown_1(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    // Console.WriteLine("Clicked"); 
    if (e.ButtonState == MouseButtonState.Pressed) 
     { 
      offset = e.GetPosition(sender as FrameworkElement); 
      Console.WriteLine("Offset: " + offset.ToString()); 
      currentPoint = e.GetPosition(sender as FrameworkElement); // Change here 
     } 
} 

private void Canvas_MouseMove_1(object sender, System.Windows.Input.MouseEventArgs e) 
{ 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      Line line = new Line(); 
      line.Stroke = SystemColors.WindowFrameBrush; 
      line.X1 = currentPoint.X; 
      line.Y1 = currentPoint.Y; 
      line.X2 = e.GetPosition(sender as FrameworkElement).X; // Change here 
      line.Y2 = e.GetPosition(sender as FrameworkElement).Y; // Change here 

      currentPoint = e.GetPosition(sender as FrameworkElement); // Change here 

      canvas.Children.Add(line); 
     } 
} 

MouseButtonEventArgs.GetPositionMouseEventArgs.GetPosition都接受,他們用它來確定鼠標事件的「相對」座標的對象。所以如果你通過this--我認爲這是你的窗口 - 它將相對於整個Window。如果您通過sender - 這是您的Canvas這些事件 - 它將相對於Canvas。 由於您Line對象將被定位相對Canvas這是他們的父母,你希望你的座標是相對於該點(Canvas的左上角)

+0

是的,剛剛發現我的錯誤,就是這樣。謝謝! – Benjin