private ImageSource DrawXAxis(FormattedText[] xheaders) { // 高さと幅 var height = xheaders.Max(h => h.Height); var width = ActualWidth; // X軸描写領域 var gwidth = width - Util.MarginLeft - xheaders.Last().Width / 2; // X軸の文字を描写 var dv = new DrawingGroup(); using (var content = dv.Open()) { // X軸の全体枠 content.DrawImage(Util.CreateWriteableBitmap((int)width, (int)height)); // X軸の文字を描写 foreach (var i in Enumerable.Range(0, xheaders.Length)) { var text = xheaders[i]; var x = gwidth / (xheaders.Length - 1) * i + Util.MarginLeft; var y = 0; // 文字を描写 content.DrawText(text, new Point(x - text.Width / 2, y)); } } // アンチエイリアス解除 var image = new DrawingImage(Util.ReleaseAntialiasing(dv)); // FreezeしたImageSourceを返却 return(image.Frozen()); }
private ImageSource DrawXAxisWhenMouseClick(Point p) { // X軸の文字を描写 var dv = new DrawingGroup(); // X軸の文字を描写 var text = GetXHeader(p.X); // ビットマップの大きさ決定 var bitmap = Util.CreateWriteableBitmap((int)PreviousXAxisImage.Width, (int)PreviousXAxisImage.Height); // ビットマップに線を描写 using (var context = bitmap.GetBitmapContext()) { var x1 = p.X - text.Width / 2; var y1 = 0; var x2 = p.X + text.Width / 2; var y2 = text.Height; bitmap.FillRectangle((int)x1, (int)y1, (int)x2, (int)y2, Util.RightClickBackground); } using (var content = dv.Open()) { content.DrawImage(PreviousXAxisImage); content.DrawImage(bitmap); content.DrawText(text, new Point(p.X - text.Width / 2, 0)); } // アンチエイリアス解除 var image = new DrawingImage(Util.ReleaseAntialiasing(dv)); // FreezeしたImageSourceを返却 return(image.Frozen()); }
/// <summary> /// マウス右クリックホールド時に対象位置を十字に区切る点線と、Y軸ヘッダにその地点の値を表示します。 /// </summary> /// <param name="container">コンテナ</param> /// <param name="p">表示位置</param> /// <returns>描写した:true / していない:false</returns> internal bool DrawMouseLine(DateOrTimeSingleChart container, Point p) { if (!(Margin.Left < p.X && p.X < GWidth + Margin.Left && Margin.Top < p.Y && p.Y < GHeight + Margin.Top)) { return(false); } // ビットマップの大きさ決定 var bitmap = Util.CreateWriteableBitmap((int)Width, (int)Height); var x = p.X; var y = p.Y; var formattedtext = GetYText(container, y); var formattedpoint = new Point(Margin.Left - Util.ScaleLineLength - formattedtext.Width, y - formattedtext.Height / 2); // ビットマップに線を描写 using (var context = bitmap.GetBitmapContext()) { bitmap.DrawLineDotted( new Point(x, Margin.Top), new Point(x, GHeight + Margin.Top), Util.RightClickColor, Util.DotSpace, Util.DotLength ); bitmap.DrawLineDotted( new Point(Margin.Left, y), new Point(GWidth + Margin.Left, y), Util.RightClickColor, Util.DotSpace, Util.DotLength ); var x1 = formattedpoint.X; var y1 = formattedpoint.Y; var x2 = x1 + formattedtext.Width; var y2 = y1 + formattedtext.Height; bitmap.FillRectangle((int)x1, (int)y1, (int)x2, (int)y2, Util.RightClickBackground); } // Y軸の文字を描写 var dv = new DrawingGroup(); using (var content = dv.Open()) { // 元々チャートに貼り付けていたビットマップを貼付 content.DrawImage(PreviousRender); // 作成したビットマップを貼付 content.DrawImage(bitmap); // 縦軸の値を描写 content.DrawText(formattedtext, formattedpoint); } // アンチエイリアス解除 var image = new DrawingImage(Util.ReleaseAntialiasing(dv)); // Freezeして設定 Render = image.Frozen(); // WriteableBitmapは必要ないので開放 bitmap = null; return(true); }
/// <summary> /// グラフを描写します。 /// </summary> /// <param name="container">コンテナ</param> /// <param name="xheaders">X軸ヘッダ文字</param> internal void Draw(DateOrTimeSingleChart container, FormattedText[] xheaders) { var series = Series?.FirstOrDefault(); if (Width <= 0 || Height <= 0 || series == null) { return; } Color = GetForeground(container); // Y軸に表示するヘッダ文字の生成 var yheaders = series != null ? Util.GetScaleStrings(Minimum, Maximum, YScaleSplit, Format) .Select(s => Util.GetFormattedText(s, container)) .ToArray() : new FormattedText[] { Util.GetFormattedText("1", container) }; // グラフ以外の領域 Margin.Top = yheaders[0].Height / 2; // 上=目盛り文字の半分 Margin.Left = Util.MarginLeft; // 左=固定値 Margin.Right = xheaders.Last().Width / 2; // 右=最後のX軸目盛り文字の半分 Margin.Bottom = Util.ScaleLineLength; // 下=X軸目盛り高さの最大値+目盛り線 // グラフ描写領域 GWidth = Width - Margin.Left - Margin.Right; GHeight = Height - Margin.Top - Margin.Bottom; //グラフ内のX軸倍率 var xzoom = GWidth / container.XRange.Ticks; // ビットマップの大きさ決定 var bitmap = Util.CreateWriteableBitmap((int)Width, (int)Height); // ビットマップに線を描写 using (var context = bitmap.GetBitmapContext()) { // X軸とY軸の目盛り線を描写 DrawXYScale(container, bitmap); // フレーム描写 DrawFrame(bitmap); // 折れ線グラフ描写 DrawPolyline(bitmap, xzoom); } // X軸とY軸の文字を描写 var dv = new DrawingGroup(); using (var content = dv.Open()) { // WriteableBitmap を貼付 content.DrawImage(bitmap.Frozen()); // Y軸の文字を描写 DrawYText(container, content, yheaders); } // WriteableBitmapは必要ないので開放 bitmap = null; // アンチエイリアス解除 var image = new DrawingImage(Util.ReleaseAntialiasing(dv)); // Freezeして設定 Render = image.Frozen(); PreviousRender = Render; }