I love WPF

"jamais sans son interface"

I love WPF

"jamais sans son interface"

Draw lines at real pixel position

If you want to draw lines in OnRender function for sample, you have a antialiasing and you can’t have a real position (at pixel)

with this code (find in https://stackoverflow.com/questions/6018106/wpf-drawingcontext-seems-ignore-snaptodevicepixels) you can solve it

 public static class SnapDrawingExtensions
    {
        public static void DrawSnappedLinesBetweenPoints(this DrawingContext dc,
            Pen pen, double lineThickness, params Point[] points)
        {
            var guidelineSet = new GuidelineSet();
            foreach (var point in points)
            {
                guidelineSet.GuidelinesX.Add(point.X);
                guidelineSet.GuidelinesY.Add(point.Y);
            }
            var half = lineThickness / 2;
            points = points.Select(p => new Point(p.X + half, p.Y + half)).ToArray();
            dc.PushGuidelineSet(guidelineSet);
            for (var i = 0; i < points.Length - 1; i = i + 2)
            {
                dc.DrawLine(pen, points[i], points[i + 1]);
            }
            dc.Pop();
        }
    }

and code sample

   protected override void OnRender(DrawingContext drawingContext)
        {
            base.OnRender(drawingContext)                ;
            Pen p = new Pen(Brushes.Black, 1);
            List<Point> pts = new List<Point>();
            for (double x = 0; x < this.ActualWidth; x+= 10)
            {
                pts.Add(new Point(x, 0));
                pts.Add(new Point(x, this.ActualHeight));
            }
            drawingContext.DrawSnappedLinesBetweenPoints(p, 1.0, pts.ToArray());
        }

 

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Retour en haut