コード例 #1
0
        internal override async void Drawing()
        {
            if (OwnerChart == null || OwnerChart.ItemsSource == null || OwnerChart.XAxis == null || OwnerChart.YAxis == null)
            {
                return;
            }
            IEnumerable <IList> items = OwnerChart.ItemsSource;
            IAxis xaxis = OwnerChart.XAxis;
            IAxis yaxis = OwnerChart.YAxis;

            if (OwnerChart.X < 0)
            {
                OwnerChart.X = 0;
            }
            int x = OwnerChart.X;

            if (OwnerChart.Y < 0)
            {
                OwnerChart.Y = 1;
            }
            int y = OwnerChart.Y;

            using (var getdatatask = xaxis.GetHistogramViewData(items, x, Count))
            {
                var datas = await getdatatask;

                if (datas.Count() <= 0)
                {
                    var tempdc = DV.RenderOpen();
                    tempdc.DrawLine(new Pen(this.Stroke, 0), new Point(0, 0), new Point(0, 0));
                    tempdc.Close();
                    return;
                }
                var maxy = datas.Max(p => p.Value);
                yaxis.Max = maxy * 1.2;
                yaxis.Min = 0;
                yaxis.Drawing();
                var height = this.ActualHeight;
                Func <double, ValueLocationConvertParam, double> YGetLocation = yaxis.GetValueLocation;
                var yconvert = yaxis.GetConvertParam();
                var task     = Task.Run(() =>
                {
                    var streamGeometry = new StreamGeometry()
                    {
                        FillRule = FillRule.EvenOdd
                    };
                    using (StreamGeometryContext sgc = streamGeometry.Open())
                    {
                        List <Point> points = new List <Point>();
                        foreach (var data in datas)
                        {
                            var yvalue = YGetLocation(data.Value, yconvert);
                            if (double.IsNaN(data.Key[0]) || double.IsInfinity(data.Key[0]) ||
                                double.IsNaN(data.Key[1]) || double.IsInfinity(data.Key[1]) ||
                                double.IsNaN(yvalue) || double.IsInfinity(yvalue))
                            {
                                continue;
                            }
                            points.Add(new Point(data.Key[0], yvalue));
                            points.Add(new Point(data.Key[1], yvalue));
                        }
                        if (points.Count > 0)
                        {
                            points.Add(new Point(points[points.Count - 1].X, height));
                            points.Add(new Point(points[0].X, height));
                            sgc.BeginFigure(new Point(points[0].X, height), true, true);
                            sgc.PolyLineTo(points, false, false);
                        }
                        else
                        {
                            sgc.BeginFigure(new Point(0, 0), true, true);
                            sgc.LineTo(new Point(0, 0), false, false);
                        }
                        sgc.Close();
                    }
                    streamGeometry.Freeze();
                    return(streamGeometry);
                });
                var geometryTemp = await task;
                task.Dispose();
                var dc = DV.RenderOpen();
                base.ClearTransform();
                dc.DrawGeometry(this.Fill, new Pen(this.Stroke, 1), geometryTemp);
                dc.Close();
            }
        }