2013-07-16 100 views
1

我正在使用InkCanvas在WPF中編寫基本的圖形編輯器。我製作了一些自定義形狀(從Stroke繼承)。當我在InkCanvas上繪製線條時,我首先和最後一點並劃一條線。這很好,但現在我不喜歡默認的「筆劃」,所以我決定重寫DynamicRenderer來實時渲染線條。WPF InkCanvas:用DynamicRenderer畫線

問題是,DynamicRenderer從原點繪製直線到筆劃的每一個點,我顯然不希望這樣,因爲它使"fan"排成一行。

有我的自定義代碼,我正在尋找解決方案,如果可能的話,只從原點到最後點畫線。

class LineRenderer : DynamicRenderer 
{ 
    private Point firstPoint; 
    private Pen pen = new Pen(new SolidColorBrush(Colors.Gray),1); 

    public LineRenderer() 
    { 
     firstPoint = new Point(double.PositiveInfinity, double.PositiveInfinity); 
    } 

    protected override void OnStylusDown(RawStylusInput rawStylusInput) 
    { 
     firstPoint = new Point(rawStylusInput.GetStylusPoints().First().ToPoint().X, rawStylusInput.GetStylusPoints().First().ToPoint().Y); 
     base.OnStylusDown(rawStylusInput); 
    } 

    protected override void OnDraw(DrawingContext drawingContext, 
            StylusPointCollection stylusPoints, 
            Geometry geometry, Brush fillBrush) 
    { 
     drawingContext.DrawLine(pen, firstPoint, stylusPoints.First().ToPoint()); 
    } 

    protected override void OnStylusUp(RawStylusInput rawStylusInput) 
    { 
     firstPoint = new Point(double.PositiveInfinity, double.PositiveInfinity); 
     base.OnStylusUp(rawStylusInput); 
    } 
} 

回答

0

什麼,我想在你的OnDraw函數的第一個點是固定的,因此始終把它作爲原點,所以你可以嘗試一下本作連續圖。

protected override void OnDraw(DrawingContext drawingContext, 
           StylusPointCollection stylusPoints, 
           Geometry geometry, Brush fillBrush) 
{ 
    drawingContext.DrawLine(pen, firstPoint, stylusPoints.First().ToPoint()); 
firstPoint = stylusPoints.First().ToPoint(); 
} 

如果你得到同樣的觀點異常把支票上它,它會更新您的羅克韋爾FirstPoint(或者你可以定義重新點名稱作爲前一個點,最初使其等於第一點並保持更新您的OnDraw的方法當我和第一點..

做,如果你想從第一個點到最後一個點的直線,你可以在繪製方法正從onstylusup方法最後一點..hope這可能會幫助你後叫你..

+0

當我移動我的鼠標,我想繪製線第一點(這就是爲什麼它是固定的)指向光標所在的位置。這有效,但是它爲運動路線上的每個單點畫線。我只需要一行:從第一個點(我點擊/固定的點)移動到當前光標位置。 –

+0

看看發生了什麼你的ondraw被稱爲線上的每一個點,所以它畫線從你的第一點到你在canvas上得到的每一個點..所以你必須更新你的第一個點到你的當前點,直到獲得該線draw..the代碼我給剛纔檢查它..它會工作..你可以檢查這個通過在ondraw方法上放置斷點.. – loop

+0

看起來我們不瞭解對方,所以我畫了一些圖[鏈接] (http://errolek.cz/img/schema.png)。我點擊(紅圈)並移動鼠標(紅線)。紅色長方形是被選中的點。當我移動鼠標時,我想繪製藍線(當時是一條)。你的代碼只是連接紅色矩形並沿着紅色矩形連線。 –

0

這是非常晚的,爲了避免在繪製筆畫的時候出現「粉絲」,試試這個:

protected override void OnDraw(DrawingContext drawingContext, 
           StylusPointCollection stylusPoints, 
           Geometry geometry, Brush fillBrush) 
     { 
      if (!_isManipulating) 
      { 
       _isManipulating = true; 
       StylusDevice currentStylus = Stylus.CurrentStylusDevice; 
       this.Reset(currentStylus, stylusPoints); 
      } 
      _isManipulating = false; 

      var pen = new Pen(brush, 2); 
      drawingContext.DrawLine(pen, startPoint,stylusPoints.First().ToPoint()); 
     } 


protected override void OnStylusDown(RawStylusInput rawStylusInput) 
     { 
      StylusPointCollection y = rawStylusInput.GetStylusPoints(); 
      startPoint = (Point)y.First(); 

      // Allocate memory to store the previous point to draw from. 
      prevPoint = new Point(double.NegativeInfinity, double.NegativeInfinity); 
      base.OnStylusDown(rawStylusInput); 
     } 

這裏的技巧是使用DynamicRenderer.Reset,其中:

清除渲染當前行程上並重繪。

重繪將重新輸入OnDraw方法,所以_isManipulating提供了一個簡單的標誌來停止循環。