2011-07-22 11 views
2

私は、コントロールのOnRenderメソッドをオーバーライドし、与えられたDrawingContextでDrawLineメソッドを呼び出すことによって、WPFで線を手動で描画しようとしています。私はこのメソッド呼び出しがすぐに線を描くわけではないことをどこかで読んだが、実際に線が現れるようにする方法を考えることはできない。WPFのカスタム線画

PathGeometry、LineSegments、Line、Polylineコントロールの組み合わせを試しました。私が望むものを描くことはできましたが、オフセットは正しくありませんでした(つまり、線を描くときには、ポリラインを描くときにすべてが間違ってオフセットされていました)。

これについてのアドバイスは素晴らしいと思います。

EDIT

ペンコード

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); 
     } 
    } 

EDIT

レンダー3210

テストプロジェクト:http://dl.dropbox.com/u/12763956/DrawingTest.zip (Visual Studioの2010年に書かれたテストプロジェクト)

使用法: - リストにポイントを追加するに隆起領域内で左クリック。 - 図面を終了してポイントをクリアするには、右クリックします。

注:(OnRenderのオーバーライドの)カスタム描画線は表示されません。

+1

OnRenderで線を描くと、それらが表示されます。あなたが間違っていることが分かるようにサンプルコードを追加できますか? –

+0

私が使っているレンダーコードを追加しました。 WPFコントロール内に含まれています。私はコントロール内とキャンバス要素でコンテンツを持たないようにしました。また、DrawLineへの呼び出しが実際にヒットしたことを確認するためにデバッグしました。 –

+0

遅れて申し訳ありません - 私のバイクに乗っていました。あなたのコードは完璧に見えます。 Debug.WriteLineを使用して、線を描画する特定の点を取得できますか?範囲外の場合は、行は表示されません。 –

答えて

2

実際には2つの問題があります。最初のものは、あなたのDrawingControlで描画するものをキャンバスの背景に隠すことです。キャンバスの背景を透明に設定すると、その問題を一時的に回避できます。

2番目の問題は、コレクションに再描画を強制するためにポイントを追加した後にInvalidateVisualに電話する必要があることです。

おそらく、キャンバスの上に表示される別のコントロールを追加し、そこに線をレンダリングする必要があります。または、DrawingControl.OnRenderメソッドでBackgroundをレンダリングする必要があります。

+0

私はこれらの変更を実装しましたが、それでも喜びはありません。変更を再確認したい場合はリンクを更新しました。 OnRenderのオーバーライドでブレークポイントを設定して、実際に呼び出されていることを確認しています。 –

+0

@ Slade - 必ずすべて再構築してください。私がそれをするまで、変更はすぐに私のために影響を及ぼさなかった。 AddPointメソッドの最後にInvalidateVisual呼び出しを追加しました。あなたの更新を確認します。 – CodeNaked

+1

@ Slade - 今回はDrawingControl.Backgroundが線を隠しています。手動でレンダリングする必要があります。基本的には、UserControlをレンダリングしています。UserControlには、子ビジュアルとコンテンツが含まれています。子ビジュアルの1つは、Background/BorderBrushをレンダリングするBorderです。これは、たとえControlTemplate内にあっても、DrawingControlの上に表示されます。 – CodeNaked

関連する問題