//--------------------------------------------------------------------------------------------------------------------------------------- protected override void OnRender(DrawingContext drawingContext) { if (CandlesMaxVolume == long.MinValue) { return; } Pen pen = new Pen(Brushes.Black, 1); double textHeight = (new FormattedText("123", CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("Verdana"), PriceTickFontSize, Brushes.Black, VisualTreeHelper.GetDpi(this).PixelsPerDip)).Height; double halfTextHeight = textHeight / 2.0; double volumeHistogramPanelWidth = ActualWidth - PriceAxisWidth; double tick_text_X = volumeHistogramPanelWidth + TICK_LINE_WIDTH + TICK_LEFT_MARGIN; double tick_line_endX = volumeHistogramPanelWidth + TICK_LINE_WIDTH; double chartHeight = ActualHeight - ChartBottomMargin - ChartTopMargin; if (chartHeight <= 0) { return; } long stepInVolumeLots = (long)(CandlesMaxVolume * ((textHeight + GapBetweenTickLabels) / chartHeight)) + 1; long stepInVolumeLots_maxDigit = MyWpfMath.MaxDigit(stepInVolumeLots); stepInVolumeLots = (stepInVolumeLots % stepInVolumeLots_maxDigit) == 0 ? stepInVolumeLots : (stepInVolumeLots / stepInVolumeLots_maxDigit + 1) * stepInVolumeLots_maxDigit; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double chartHeight_candlesLHRange_Ratio = chartHeight / CandlesMaxVolume; void DrawPriceTick(long volume) { FormattedText priceTickFormattedText = new FormattedText(volume.ToString(), CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("Verdana"), PriceTickFontSize, Brushes.Black, VisualTreeHelper.GetDpi(this).PixelsPerDip); double y = ChartTopMargin + (CandlesMaxVolume - volume) * chartHeight_candlesLHRange_Ratio; drawingContext.DrawText(priceTickFormattedText, new Point(tick_text_X, y - halfTextHeight)); drawingContext.DrawLine(pen, new Point(volumeHistogramPanelWidth, y), new Point(tick_line_endX, y)); if (IsGridlinesEnabled && GridlinesPen != null) { drawingContext.DrawLine(GridlinesPen, new Point(0, y), new Point(volumeHistogramPanelWidth, y)); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ long theMostRoundVolume = MyWpfMath.MaxDigit(CandlesMaxVolume); DrawPriceTick(theMostRoundVolume); long maxVolumeThreshold = (long)(CandlesMaxVolume + (ChartTopMargin - halfTextHeight) / chartHeight_candlesLHRange_Ratio); long minVolumeThreshold = (long)(CandlesMaxVolume + (ChartTopMargin - ActualHeight + halfTextHeight) / chartHeight_candlesLHRange_Ratio); int step_i = 1; long next_tick = theMostRoundVolume + step_i * stepInVolumeLots; while (next_tick < maxVolumeThreshold) { DrawPriceTick(next_tick); step_i++; next_tick = theMostRoundVolume + step_i * stepInVolumeLots; } step_i = 1; next_tick = theMostRoundVolume - step_i * stepInVolumeLots; while (next_tick > minVolumeThreshold) { DrawPriceTick(next_tick); step_i++; next_tick = theMostRoundVolume - step_i * stepInVolumeLots; } }
//--------------------------------------------------------------------------------------------------------------------------------------- protected override void OnRender(DrawingContext drawingContext) { Pen pen = new Pen(Brushes.Black, 1); double textHeight = (new FormattedText("123", CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("Verdana"), PriceTickFontSize, Brushes.Black, VisualTreeHelper.GetDpi(this).PixelsPerDip)).Height; double halfTextHeight = textHeight / 2.0; double candlePanelWidth = ActualWidth - PriceAxisWidth; double tick_text_X = candlePanelWidth + TICK_LINE_WIDTH + TICK_LEFT_MARGIN; double tick_line_endX = candlePanelWidth + TICK_LINE_WIDTH; double chartHeight = ActualHeight - ChartBottomMargin - ChartTopMargin; double stepInRubles = (CandlesLH.Y - CandlesLH.X) / chartHeight * (textHeight + GapBetweenTickLabels); double stepInRubles_maxDigit = MyWpfMath.MaxDigit(stepInRubles); stepInRubles = Math.Ceiling(stepInRubles / stepInRubles_maxDigit) * stepInRubles_maxDigit; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double chartHeight_candlesLHRange_Ratio = chartHeight / (CandlesLH.Y - CandlesLH.X); void DrawPriceTick(double price) { FormattedText priceTickFormattedText = new FormattedText(price.ToString(), CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, new Typeface("Verdana"), PriceTickFontSize, Brushes.Black, VisualTreeHelper.GetDpi(this).PixelsPerDip); double y = ChartTopMargin + (CandlesLH.Y - price) * chartHeight_candlesLHRange_Ratio; drawingContext.DrawText(priceTickFormattedText, new Point(tick_text_X, y - halfTextHeight)); drawingContext.DrawLine(pen, new Point(candlePanelWidth, y), new Point(tick_line_endX, y)); if (IsGridlinesEnabled && GridlinesPen != null) { drawingContext.DrawLine(GridlinesPen, new Point(0, y), new Point(candlePanelWidth, y)); } } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ double theMostRoundPrice = MyWpfMath.TheMostRoundValueInsideRange(CandlesLH.X, CandlesLH.Y); DrawPriceTick(theMostRoundPrice); double maxPriceThreshold = CandlesLH.Y + (ChartTopMargin - halfTextHeight) / chartHeight_candlesLHRange_Ratio; double minPriceThreshold = CandlesLH.Y + (ChartTopMargin - ActualHeight + halfTextHeight) / chartHeight_candlesLHRange_Ratio; int step_i = 1; double next_tick = theMostRoundPrice + step_i * stepInRubles; while (next_tick < maxPriceThreshold) { DrawPriceTick(next_tick); step_i++; next_tick = theMostRoundPrice + step_i * stepInRubles; } step_i = 1; next_tick = theMostRoundPrice - step_i * stepInRubles; while (next_tick > minPriceThreshold) { DrawPriceTick(next_tick); step_i++; next_tick = theMostRoundPrice - step_i * stepInRubles; } // Горизонтальные линии на всю ширину разделяющая и окаймляющая панели времени и даты: //drawingContext.DrawLine(pen, new Point(0, 0), new Point(RenderSize.Width, 0)); //drawingContext.DrawLine(pen, new Point(0, halfRenderSizeHeight), new Point(RenderSize.Width, halfRenderSizeHeight)); //drawingContext.DrawLine(pen, new Point(0, RenderSize.Height), new Point(RenderSize.Width, RenderSize.Height)); }