首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用DrawingContext绘制曲线

用DrawingContext绘制曲线
EN

Stack Overflow用户
提问于 2014-05-05 13:08:25
回答 1查看 1.7K关注 0票数 1

我正在尝试做一个自定义控件,用WPF绘制一条曲线。

我做了一个继承自“控制”的控件:

代码语言:javascript
复制
public class Courbe : Control {

    private static readonly CultureInfo CI = new CultureInfo("en-US");
    private Pen _p = new Pen();

    public Courbe() {
        Points = new List<Point>();
    }
    static Courbe() {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(Courbe), new FrameworkPropertyMetadata(typeof(Courbe)));
    }

    protected override void OnRender(DrawingContext drawingContext) {
        base.OnRender(drawingContext);
        EcritureEvenement.loggerEvenement("verif point...", TypesEvenements.DEBUG, "");
        if (Points.Count <= 1) return;
        EcritureEvenement.loggerEvenement("plus d'un point", TypesEvenements.DEBUG, "");
        OffsetX = (int)Math.Ceiling(Width / 11);
        OffsetY = (int)Math.Ceiling(Height / 11);

        double differenceX = MaxX - MinX;
        double differenceY = MaxY - MinY;

        double rapportTailleDifferenceX = (Width) / differenceX;
        double rapportTailleDifferenceY = (Height) / differenceY;

        double xMinLigne = rapportTailleDifferenceX * MinX + OffsetX;
        double xMaxLigne = rapportTailleDifferenceX * MaxX + OffsetX;
        double yMinLigne = (Height - (rapportTailleDifferenceY * (MinY - MinY)) - OffsetY);
        double yMaxLigne = (Height - (rapportTailleDifferenceY * (MaxY - MinY)) - OffsetY);
        Point debutAxeX = new Point(xMinLigne, yMinLigne);
        Point finAxeX = new Point(xMaxLigne, yMinLigne);
        Point debutAxeY = new Point(xMinLigne, yMinLigne);
        Point finAxeY = new Point(xMinLigne, yMaxLigne);
        drawingContext.DrawLine(_p, debutAxeX, finAxeX);
        drawingContext.DrawLine(_p, debutAxeY, finAxeY);

        int taillePolice = (int)Math.Floor(Width / 80);

        double dizieme = differenceY / 10;
        for (int i = 0; i < 10; i++) {
            float pointGraduation = (float)(Height - ((dizieme * i) * rapportTailleDifferenceY) - OffsetY);

            FormattedText texte = new FormattedText(dizieme * i + MinY + "", CI, FlowDirection.LeftToRight, new Typeface("Verdana"), taillePolice, Brushes.Black);
            drawingContext.DrawText(texte, new Point(0, pointGraduation - taillePolice));
            Point p1 = new Point(xMinLigne - 5, pointGraduation);
            Point p2 = new Point(xMinLigne + 5, pointGraduation);
            drawingContext.DrawLine(_p, p1, p2);
        }

        PathFigure pf = new PathFigure();

        foreach (Point p in Points) {
            double x1 = (p.X * rapportTailleDifferenceX) + OffsetX;
            double y1 = Height - ((p.Y - MinY) * rapportTailleDifferenceY) - OffsetY;
            Point scaledPoint = new Point((float)x1, (float)y1);
            PathSegment ps = new LineSegment(scaledPoint, false);
            pf.Segments.Add(ps);
        }
        Geometry g = new PathGeometry(new[]{pf});
        drawingContext.DrawGeometry(Brushes.Aqua, new Pen(Brushes.Blue, 5), g);
    }

    #region Properties
    public List<Point> Points { get; set; }
    public int MinX { get; set; }
    public int MaxX { get; set; }
    public int MinY { get; set; }
    public int MaxY { get; set; }
    public int OffsetX { get; set; }
    public int OffsetY { get; set; }

    private Color _penColor;

    public Color PenColor {
        get { return _penColor; }
        set {
            _p = new Pen(new SolidColorBrush(value), 5);
            _penColor = value;
        }
    }

    #endregion
}

我的问题是,这条线似乎不是用钢笔画的,而是用画笔画的(如果我把null代替Brushes.Aqua,什么都不会出现)。

谢谢你

编辑:如果我使用DrawLine而不是DrawGeometry,它就能工作了:

代码语言:javascript
复制
Point ancienPoint = new Point(-1, -1);
foreach (Point p in Points) {

    double x1 = (p.X * rapportTailleDifferenceX) + OffsetX;
    double y1 = Height - ((p.Y - MinY) * rapportTailleDifferenceY) - OffsetY;
    Point scaledPoint = new Point((float)x1, (float)y1);
    if (ancienPoint.X != -1 && ancienPoint.Y != -1) {
        drawingContext.DrawLine(new Pen(new SolidColorBrush(Colors.Blue), 1), ancienPoint, scaledPoint);
    }
    ancienPoint = scaledPoint;
}

但在性能方面,windows窗体的速度比Graphics.DrawCurve慢2倍。有办法让它更快吗?

Edit2:我没有尝试使用本机控件,因为当我尝试在windows窗体(图表)中使用该控件时,该控件无法处理该进程(大约每50 ms绘制一条5000行)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-05 14:11:19

问题是在调用isStroked构造函数时将LineSegment设置为LineSegment

变化

代码语言:javascript
复制
PathSegment ps = new LineSegment(scaledPoint, false);

代码语言:javascript
复制
PathSegment ps = new LineSegment(scaledPoint, true);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23473326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档