2011-07-22 78 views
2

我想通過重寫控件的OnRender方法並在給定DrawingContext上調用DrawLine方法來手動在WPF中繪製一條線。我在某處讀到這種方法調用不會立即畫出線條,但我無法弄清楚如何真正引起線條出現。WPF中的自定義線條畫

我試過使用PathGeometry,LineSegments,Line和Polyline控件的組合。我可以畫出我想要的東西,但偏移量不太正確(即繪製線條時很準確,繪製多段線時,所有東西都不正確地偏移)。

對此的任何建議都會很好。

編輯

筆代碼

private static readonly Pen LinePen = new Pen(new SolidColorBrush(Colors.Green), 3.0d); 
    private static readonly Pen WayPointPen = new Pen(new SolidColorBrush(Colors.Gray), 3.0d); 

渲染代碼

protected override void OnRender(DrawingContext drawingContext) 
    { 
     // Draw way points 
     this.DrawWayPoints(drawingContext); 

     if (mDrawing) 
     { 
      // Draw current line 
      this.DrawCurrentLine(drawingContext); 
     } 
    } 

    private void DrawCurrentLine(DrawingContext context) 
    { 
     if(mStartPoint.HasValue && mEndPoint.HasValue) 
     { 
      // Draw the line 
      context.DrawLine(LinePen, mStartPoint.Value, mEndPoint.Value); 
     } 
    } 

    private void DrawWayPoints(DrawingContext context) 
    { 
     if (mWayPoints.Count < 2) 
     { 
      return; 
     } 

     // Draw all points 
     for (int i = 0; i < mWayPoints.Count - 1; i++) 
     { 
      var start = mWayPoints[i]; 
      var end = mWayPoints[i + 1]; 

      // Draw the line 
      context.DrawLine(WayPointPen, start, end); 
     } 
    } 

編輯

測試項目:http://dl.dropbox.com/u/12763956/DrawingTest.zip (寫在Visual Studio 2010測試項目)

用法: - 凸起區域內按左鍵點添加到列表中。 - 右鍵結束繪圖並清除點。

注意:自定義畫線(在OnRender覆蓋)不會出現。

+1

我用OnRender畫線並出現。你可以添加示例代碼,以便我可以看到你做錯了什麼? –

+0

我已經添加了我正在使用的呈現代碼。它包含在WPF控件中。我試過在控件和畫布元素中沒有內容。我也調試過,以確保對DrawLine的調用實際上被擊中,並且它們是。 –

+0

抱歉延遲應答 - 在我的摩托車上關閉。你的代碼看起來非常好。你可以使用Debug.WriteLine來獲取你正試圖繪製線的特定點嗎?如果他們超出界限,則不會出現任何行。 –

回答

2

實際上這裏有兩個問題。第一個是你的Canvas的Background可以覆蓋你在DrawingControl上繪製的任何東西。因此,如果將「畫布背景」設置爲「透明」,則可以暫時解決該問題。

第二個問題是在向集合中添加一個點以強制重繪之後,您需要調用InvalidateVisual

您可能需要添加另一個出現在畫布頂部的控件,並在那裏渲染線條。或者你需要在DrawingControl.OnRender方法中自己渲染背景。

+0

我已經實現了這些變化,但仍然沒有喜悅。如果您想重新檢查更改,我已更新鏈接。我還在OnRender覆蓋中設置了一個斷點,以確保它實際上被調用。 –

+0

@Slade - 確保做一個'重建全部'。這些變化並沒有立即影響我,直到我做到了。我在AddPoint方法的末尾添加了InvalidateVisual調用。雖然會檢查你的更新。 – CodeNaked

+1

@Slade - 這次DrawingControl.Background覆蓋了線條。你需要手動渲染。基本上,你正在渲染你的UserControl,它有一些孩子的視覺效果以及你的內容。其中一個兒童視覺效果是一個呈現背景/邊界刷子的邊框。這仍然出現在DrawingControl的頂部,即使它在ControlTemplate中。 – CodeNaked