2015-04-28 2 views
0

У меня есть приложение, где вы можете рисовать на холсте (например, Paint). # Код C выглядит в основном так:Ничья линии с высоким StrokeThickness в silverlight

private void startDrawing(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    _drawingStart = e.GetPosition((UIElement)sender); 
    _isDrawing = true; 
} 

private void stopDrawing(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    _isDrawing = false; 
} 

private void doDrawing(object sender, System.Windows.Input.MouseEventArgs e) 
{ 
    if (_isDrawing) 
    { 
     Point current = e.GetPosition((UIElement)sender); 
     Line line = new Line() { X1 = _drawingStart.X, Y1 = _drawingStart.Y, X2 = current.X, Y2 = current.Y }; 
     line.Stroke = Color; 
     line.StrokeThickness = StrokeThickness; 
     DrawingCanvas.Children.Add(line); 
     _drawingStart = current; 
    } 
} 

И Холст:

<Canvas x:Name="DrawingCanvas" 
     Grid.Row="1" 
     Grid.Column="1" 
     Background="Transparent" 
     MouseLeftButtonDown="startDrawing" 
     MouseLeftButtonUp="stopDrawing" 
     MouseMove="doDrawing" /> 

Когда StrokeThickness мал, все работает нормально. Но если я установил StrokeThickness на большее число (например, 100), линия рисуется в стиле зигзагообразного стиля и не является «твердой». Любые идеи, как этого избежать? Или, может быть, как добиться округленной линии (округлые концы линии)? Я думаю, что это решит проблему.

+0

Было бы намного проще добавить точки в коллекцию «Точки» полилинии. См. Мой отредактированный ответ. – Clemens

ответ

0

Я думаю, что вы собираетесь быть очарованным с моим ответом:

enter image description here

Point _drawingStart; 
    bool _isDrawing; 
    private void startDrawing(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     _drawingStart = e.GetPosition((UIElement)sender); 
     InitializePath(); 
     _isDrawing = true; 
    } 

    private void stopDrawing(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     _isDrawing = false; 
    } 

    private void doDrawing(object sender, System.Windows.Input.MouseEventArgs e) 
    { 
     if (_isDrawing) 
     { 
      AddPoint(e.GetPosition((UIElement)sender)); 
     } 
    } 
private void AddPoint(Point newpoint) 
{ 
     LineSegment l = new LineSegment() { Point = newpoint }; 
     pathFigure.Segments.Add(l); 
     pathFigure.StartPoint = (pathFigure.Segments.First() as LineSegment).Point; 
    } 

    PathFigure pathFigure; 
    Path path; 
    private void InitializePath() 
    { 
     path = new Path() 
     { 
      StrokeLineJoin = PenLineJoin.Bevel, 
      StrokeDashCap = PenLineCap.Round, 
      StrokeEndLineCap = PenLineCap.Round, 
      StrokeStartLineCap = PenLineCap.Round, 
      StrokeThickness = 100.0, 
      Stroke = new SolidColorBrush(Colors.Red) 
     }; 

     pathFigure = new PathFigure(); 
     PathGeometry pathGeometry = new PathGeometry(); 
     pathGeometry.Figures = new PathFigureCollection(); 
     pathGeometry.Figures.Add(pathFigure); 
     path.Data = pathGeometry; 
     DrawingCanvas.Children.Add(path); 
    } 

Является более гладкой, потому что создает реальную ра th вместо многих строк, надеюсь, вы сочтете это полезным

+0

Отлично! Это решило проблему для меня. – drumm3r

0

Вы должны установить свойство StrokeLineJoin линии либо Bevel, либо Round.

var line = new Line 
{ 
    X1 = _drawingStart.X, 
    Y1 = _drawingStart.Y, 
    X2 = current.X, 
    Y2 = current.Y, 
    Stroke = Color, 
    StrokeThickness = StrokeThickness, 
    StrokeLineJoin = PenLineJoin.Round 
}; 

Смотрите PenLineJoin Enumeration страницу на MSDN для деталей.

В качестве альтернативы вы можете установить StrokeMiterLimit на подходящее значение.


Тем не менее, более элегантное решение было бы добавить точки в Points коллекции полилинию:

private Polyline currentPolyline; 

private void startDrawing(object sender, MouseButtonEventArgs e) 
{ 
    var canvas = (Canvas)sender; 

    currentPolyline = new Polyline 
    { 
     Stroke = Color, 
     StrokeThickness = StrokeThickness, 
     StrokeStartLineCap = PenLineCap.Round, 
     StrokeEndLineCap = PenLineCap.Round, 
     StrokeLineJoin = PenLineJoin.Round 
    }; 

    currentPolyline.Points.Add(e.GetPosition(canvas)); 
    canvas.Children.Add(currentPolyline); 
} 

private void stopDrawing(object sender, MouseButtonEventArgs e) 
{ 
    currentPolyline = null; 
} 

private void doDrawing(object sender, MouseEventArgs e) 
{ 
    if (currentPolyline != null) 
    { 
     currentPolyline.Points.Add(e.GetPosition((UIElement)sender)); 
    } 
} 
Смежные вопросы