//internal static void Update(Chart chart, RenderAs currentRenderAs, List<DataSeries> selectedDataSeries4Rendering, VcProperties property, object newValue) //{ // Boolean is3D = chart.View3D; // ChartArea chartArea = chart.ChartArea; // Canvas ChartVisualCanvas = chart.ChartArea.ChartVisualCanvas; // // Double width = chart.ChartArea.ChartVisualCanvas.Width; // // Double height = chart.ChartArea.ChartVisualCanvas.Height; // Panel preExistingPanel = null; // Dictionary<RenderAs, Panel> RenderedCanvasList = chart.ChartArea.RenderedCanvasList; // if (chartArea.RenderedCanvasList.ContainsKey(currentRenderAs)) // { // preExistingPanel = RenderedCanvasList[currentRenderAs]; // } // Panel renderedChart = chartArea.RenderSeriesFromList(preExistingPanel, selectedDataSeries4Rendering); // if (preExistingPanel == null) // { // chartArea.RenderedCanvasList.Add(currentRenderAs, renderedChart); // ChartVisualCanvas.Children.Add(renderedChart); // } //} /// <summary> /// /// </summary> /// <param name="dataPoint"></param> /// <param name="property"></param> /// <param name="newValue"></param> /// <param name="isAxisChanged"></param> private static void UpdateDataPoint(DataPoint dataPoint, VcProperties property, object newValue, Boolean isAxisChanged) { Chart chart = dataPoint.Chart as Chart; PlotDetails plotDetails = chart.PlotDetails; Marker marker = dataPoint.Marker; DataSeries dataSeries = dataPoint.Parent; Canvas pointChartCanvas = dataSeries.Faces.Visual as Canvas; Double plotHeight = chart.ChartArea.ChartVisualCanvas.Height; Double plotWidth = chart.ChartArea.ChartVisualCanvas.Width; ColumnChart.UpdateParentVisualCanvasSize(chart, pointChartCanvas); if (property == VcProperties.Enabled) { CreateOrUpdateAPointDataPoint(pointChartCanvas, dataPoint, plotWidth, plotHeight); return; } if (dataPoint.Faces == null) { return; } Grid bubbleVisual = dataPoint.Faces.Visual as Grid; switch (property) { case VcProperties.Bevel: break; case VcProperties.Cursor: break; case VcProperties.Href: dataPoint.SetHref2DataPointVisualFaces(); break; case VcProperties.HrefTarget: dataPoint.SetHref2DataPointVisualFaces(); break; case VcProperties.LabelBackground: if (marker != null) { marker.TextBackground = dataPoint.LabelBackground; } break; case VcProperties.LabelEnabled: CreateOrUpdateAPointDataPoint(pointChartCanvas, dataPoint, plotWidth, plotHeight); //if (marker != null) // marker.LabelEnabled = (Boolean)dataPoint.LabelEnabled; break; case VcProperties.LabelFontColor: if (marker != null) { marker.FontColor = dataPoint.LabelFontColor; } break; case VcProperties.LabelFontFamily: if (marker != null) { marker.FontFamily = dataPoint.LabelFontFamily; } break; case VcProperties.LabelFontStyle: if (marker != null) { marker.FontStyle = (FontStyle)dataPoint.LabelFontStyle; } break; //case VcProperties.LabelFontSize: // if (marker != null) // marker.FontSize = (Double)dataPoint.LabelFontSize; // break; case VcProperties.LabelFontWeight: if (marker != null) { marker.FontWeight = (FontWeight)dataPoint.LabelFontWeight; } break; case VcProperties.LabelAngle: if (marker != null) { marker.FontWeight = (FontWeight)dataPoint.LabelFontWeight; } break; case VcProperties.LegendText: chart.InvokeRender(); break; case VcProperties.Color: case VcProperties.LightingEnabled: if (marker != null) { marker.MarkerShape.Fill = (chart.View3D ? Graphics.Get3DBrushLighting(dataPoint.Color, (Boolean)dataPoint.LightingEnabled) : ((Boolean)dataPoint.LightingEnabled ? Graphics.GetLightingEnabledBrush(dataPoint.Color, "Linear", null) : dataPoint.Color)); } break; case VcProperties.MarkerBorderColor: if (marker != null) { marker.BorderColor = dataPoint.MarkerBorderColor; } break; case VcProperties.MarkerBorderThickness: if (marker != null) { marker.BorderThickness = dataPoint.MarkerBorderThickness.Value.Left; } break; case VcProperties.MarkerColor: if (marker != null) { marker.MarkerFillColor = dataPoint.MarkerColor; } break; case VcProperties.LabelFontSize: case VcProperties.LabelStyle: case VcProperties.LabelText: case VcProperties.MarkerScale: case VcProperties.MarkerSize: case VcProperties.MarkerType: CreateOrUpdateAPointDataPoint(pointChartCanvas, dataPoint, plotWidth, plotHeight); break; case VcProperties.ShadowEnabled: if (marker != null) { marker.ShadowEnabled = (Boolean)dataPoint.ShadowEnabled; marker.ApplyRemoveShadow(); } break; case VcProperties.Opacity: if (marker != null) { marker.Visual.Opacity = dataPoint.Opacity * dataSeries.Opacity; } break; case VcProperties.ShowInLegend: chart.InvokeRender(); break; case VcProperties.ToolTipText: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); break; case VcProperties.XValueFormatString: case VcProperties.YValueFormatString: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); CreateOrUpdateAPointDataPoint(pointChartCanvas, dataPoint, plotWidth, plotHeight); break; case VcProperties.XValueType: chart.InvokeRender(); break; case VcProperties.XValue: case VcProperties.YValue: if (isAxisChanged) { UpdateDataSeries(dataSeries, property, newValue, false); } else if (marker != null) { dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); if ((Boolean)dataPoint.LabelEnabled) { marker.Text = dataPoint.TextParser(dataPoint.LabelText); } BubbleChart.UpdateBubblePositionAccording2XandYValue(dataPoint, plotWidth, plotHeight, chart.AnimatedUpdate, marker.MarkerShape.Width, marker.MarkerShape.Width); } break; } if (pointChartCanvas.Parent != null) { Double tickLengthOfAxisX = (from tick in chart.AxesX[0].Ticks where (Boolean)chart.AxesX[0].Enabled && (Boolean)tick.Enabled select tick.TickLength).Sum(); if (tickLengthOfAxisX == 0) { tickLengthOfAxisX = 5; } Double tickLengthOfPrimaryAxisY = (from axis in chart.AxesY where axis.AxisType == AxisTypes.Primary from tick in axis.Ticks where (Boolean)axis.Enabled && (Boolean)tick.Enabled select tick.TickLength).Sum(); if (tickLengthOfPrimaryAxisY == 0) { tickLengthOfPrimaryAxisY = 8; } Double tickLengthOfSecondaryAxisY = (from axis in chart.AxesY where axis.AxisType == AxisTypes.Secondary from tick in axis.Ticks where (Boolean)axis.Enabled && (Boolean)tick.Enabled select tick.TickLength).Sum(); if (tickLengthOfSecondaryAxisY == 0) { tickLengthOfSecondaryAxisY = 8; } Double plotGroupCount = (from c in chart.PlotDetails.PlotGroups where c.AxisY.AxisType == AxisTypes.Secondary select c).Count(); RectangleGeometry clipRectangle = new RectangleGeometry(); clipRectangle.Rect = new Rect(-tickLengthOfPrimaryAxisY, -chart.ChartArea.PLANK_DEPTH - 4, plotWidth + tickLengthOfSecondaryAxisY + (plotGroupCount > 0 ? tickLengthOfPrimaryAxisY : 8) + chart.ChartArea.PLANK_OFFSET, plotHeight + chart.ChartArea.PLANK_DEPTH + chart.ChartArea.PLANK_THICKNESS + tickLengthOfAxisX + 4); (pointChartCanvas.Parent as Canvas).Clip = clipRectangle; } }
internal static void UpdateVisualObject(RenderAs chartType, Visifire.Commons.ObservableObject sender, VcProperties property, object newValue, Boolean isAXisChanged) { Boolean isDataPoint = sender.GetType().Equals(typeof(DataPoint)); DataPoint dataPoint = sender as DataPoint; Chart chart = (sender as ObservableObject).Chart as Chart; switch (chartType) { case RenderAs.Column: case RenderAs.Bar: ColumnChart.Update(sender, property, newValue, isAXisChanged); //ColumnChart.GetVisualObjectForColumnChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; // renderedCanvas = BarChart.GetVisualObjectForBarChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); case RenderAs.Line: //if (isAXisChanged && isDataPoint && chart._partialUpdateAnimation) //{ foreach (DataSeries ds in chart.Series) // { // //if (ds == dataPoint.Parent) // // continue; // foreach (DataPoint dp in ds.DataPoints) // { // RenderHelper.UpdateVisualObject(ds.RenderAs, dp, property, newValue, false); // } // } //} //else // LineChart.Update(sender, property, newValue); LineChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.Point: PointChart.Update(sender, property, newValue, isAXisChanged); //renderedCanvas = PointChart.GetVisualObjectForPointChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.Bubble: BubbleChart.Update(sender, property, newValue, isAXisChanged); //renderedCanvas = BubbleChart.GetVisualObjectForBubbleChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.Area: AreaChart.Update(sender, property, newValue, isAXisChanged); //renderedCanvas = AreaChart.GetVisualObjectForAreaChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.StackedColumn: ColumnChart.Update(sender, property, newValue, isAXisChanged); //renderedCanvas = ColumnChart.GetVisualObjectForStackedColumnChart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedColumn100: ColumnChart.Update(sender, property, newValue, isAXisChanged); // renderedCanvas = ColumnChart.GetVisualObjectForStackedColumn100Chart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedBar: ColumnChart.Update(sender, property, newValue, isAXisChanged); //renderedCanvas = BarChart.GetVisualObjectForStackedBarChart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedBar100: ColumnChart.Update(sender, property, newValue, isAXisChanged); //renderedCanvas = BarChart.GetVisualObjectForStackedBar100Chart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.Pie: //renderedCanvas = PieChart.GetVisualObjectForPieChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.Doughnut: //renderedCanvas = PieChart.GetVisualObjectForDoughnutChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.StackedArea: //renderedCanvas = AreaChart.GetVisualObjectForStackedAreaChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.StackedArea100: //renderedCanvas = AreaChart.GetVisualObjectForStackedArea100Chart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.SectionFunnel: //renderedCanvas = FunnelChart.GetVisualObjectForFunnelChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled, false); break; case RenderAs.StreamLineFunnel: //renderedCanvas = FunnelChart.GetVisualObjectForFunnelChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled, true); break; case RenderAs.Stock: StockChart.Update(sender, property, newValue, isAXisChanged); //renderedCanvas = StockChart.GetVisualObjectForStockChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.CandleStick: CandleStick.Update(sender, property, newValue, isAXisChanged); //renderedCanvas = CandleStick.GetVisualObjectForCandleStick(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; } chart.ChartArea.AttachScrollEvents(); }
/// <summary> /// /// </summary> /// <param name="obj">Object may be DataSeries or DataPoint</param> /// <param name="property"></param> /// <param name="newValue"></param> private static void UpdateDataSeries(ObservableObject obj, VcProperties property, object newValue) { DataPoint dataPoint = null; DataSeries dataSeries = obj as DataSeries; Boolean isDataPoint = false; if (dataSeries == null) { isDataPoint = true; dataPoint = obj as DataPoint; dataSeries = dataPoint.Parent; } Chart chart = dataSeries.Chart as Chart; if (chart == null) { return; } PlotGroup plotGroup = dataSeries.PlotGroup; Canvas line2dCanvas = null; Canvas label2dCanvas = null; Path linePath = null; Path lineShadowPath = null; if (dataSeries.Faces != null) { if (dataSeries.Faces.Parts.Count > 0) { linePath = dataSeries.Faces.Parts[0] as Path; if (dataSeries.Faces.Parts.Count > 1) { lineShadowPath = dataSeries.Faces.Parts[1] as Path; } } line2dCanvas = dataSeries.Faces.Visual as Canvas; label2dCanvas = dataSeries.Faces.LabelCanvas as Canvas; } else if (dataSeries.Faces == null && property == VcProperties.Enabled && (Boolean)newValue == true) { ColumnChart.Update(chart, dataSeries.RenderAs, (from ds in chart.InternalSeries where ds.RenderAs == RenderAs.QuickLine select ds).ToList()); return; } else { return; } Double height = chart.ChartArea.ChartVisualCanvas.Height; Double width = chart.ChartArea.ChartVisualCanvas.Width; switch (property) { case VcProperties.Color: if (linePath != null) { Brush lineColorValue = (newValue != null) ? newValue as Brush : dataSeries.Color; linePath.Stroke = ((Boolean)dataSeries.LightingEnabled) ? Graphics.GetLightingEnabledBrush(lineColorValue, "Linear", new Double[] { 0.65, 0.55 }) : lineColorValue; //dataPoint.Color; } break; case VcProperties.LightingEnabled: if (linePath != null) { linePath.Stroke = ((Boolean)newValue) ? Graphics.GetLightingEnabledBrush(dataSeries.Color, "Linear", new Double[] { 0.65, 0.55 }) : dataSeries.Color; } break; case VcProperties.Opacity: if (linePath != null) { linePath.Opacity = (Double)dataSeries.Opacity; } break; case VcProperties.LineStyle: case VcProperties.LineThickness: if (lineShadowPath != null) { lineShadowPath.StrokeThickness = (Double)dataSeries.LineThickness; } if (linePath != null) { linePath.StrokeThickness = (Double)dataSeries.LineThickness; } if (lineShadowPath != null) { lineShadowPath.StrokeDashArray = ExtendedGraphics.GetDashArray(dataSeries.LineStyle); } if (linePath != null) { linePath.StrokeDashArray = ExtendedGraphics.GetDashArray(dataSeries.LineStyle); } break; case VcProperties.Enabled: if (!isDataPoint && line2dCanvas != null) { if ((Boolean)newValue == false) { line2dCanvas.Visibility = Visibility.Collapsed; label2dCanvas.Visibility = Visibility.Collapsed; } else { if (line2dCanvas.Parent == null) { ColumnChart.Update(chart, dataSeries.RenderAs, (from ds in chart.InternalSeries where ds.RenderAs == RenderAs.QuickLine select ds).ToList()); return; } line2dCanvas.Visibility = Visibility.Visible; label2dCanvas.Visibility = Visibility.Visible; } chart._toolTip.Hide(); break; } goto RENDER_SERIES; case VcProperties.ShadowEnabled: case VcProperties.DataPoints: case VcProperties.YValue: case VcProperties.YValues: case VcProperties.XValue: case VcProperties.ViewportRangeEnabled: case VcProperties.DataPointUpdate: RENDER_SERIES: LineChart.UpdateLineSeries(dataSeries, width, height, label2dCanvas); break; } }
internal static void UpdateVisualObject(Chart chart, VcProperties property, object newValue, Boolean partialUpdate) { if (partialUpdate && chart._datapoint2UpdatePartially.Count <= 500) { chart.PARTIAL_DP_RENDER_LOCK = false; Boolean isNeed2UpdateAllSeries = false; foreach (KeyValuePair <DataPoint, VcProperties> dpInfo in chart._datapoint2UpdatePartially) { DataPoint dp = dpInfo.Key; if (dpInfo.Value == VcProperties.XValue) { isNeed2UpdateAllSeries = true; break; } PropertyInfo pInfo = dp.GetType().GetProperty(dpInfo.Value.ToString()); newValue = pInfo.GetValue(dp, null); isNeed2UpdateAllSeries = dpInfo.Key.UpdateVisual(dpInfo.Value, newValue, true); if (isNeed2UpdateAllSeries) { break; } } if (!isNeed2UpdateAllSeries) { return; } } chart.ChartArea.PrePartialUpdateConfiguration(chart, VcProperties.None, null, null, false, true, true, AxisRepresentations.AxisY, true); //chart.ChartArea.RenderSeries(); Int32 renderedSeriesCount = 0; // Contain count of series that have been already rendered // Contains a list of serties as per the drawing order generated in the plotdetails List <DataSeries> dataSeriesListInDrawingOrder = chart.PlotDetails.SeriesDrawingIndex.Keys.ToList(); List <DataSeries> selectedDataSeries4Rendering; // Contains a list of serries to be rendered in a rendering cycle Int32 currentDrawingIndex; // Drawing index of the selected series RenderAs currentRenderAs; // Rendereas type of the selected series // This loop will select series for rendering and it will repeat until all series have been rendered while (renderedSeriesCount < chart.InternalSeries.Count) { selectedDataSeries4Rendering = new List <DataSeries>(); currentRenderAs = dataSeriesListInDrawingOrder[renderedSeriesCount].RenderAs; currentDrawingIndex = chart.PlotDetails.SeriesDrawingIndex[dataSeriesListInDrawingOrder[renderedSeriesCount]]; for (Int32 i = renderedSeriesCount; i < chart.InternalSeries.Count; i++) { DataSeries ds = dataSeriesListInDrawingOrder[i]; if (currentRenderAs == ds.RenderAs && currentDrawingIndex == chart.PlotDetails.SeriesDrawingIndex[ds]) { selectedDataSeries4Rendering.Add(ds); } } if (selectedDataSeries4Rendering.Count == 0) { break; } chart._toolTip.Hide(); switch (currentRenderAs) { case RenderAs.Column: case RenderAs.Bar: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); //ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); break; //renderedCanvas = BarChart.GetVisualObjectForBarChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); case RenderAs.Line: if (property == VcProperties.Enabled) { ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); } //LineChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); else { //ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); foreach (DataSeries ds in selectedDataSeries4Rendering) { LineChart.Update(ds, property, newValue, false); } } break; case RenderAs.Point: foreach (DataSeries ds in selectedDataSeries4Rendering) { foreach (DataPoint dp in ds.InternalDataPoints) { RenderHelper.UpdateVisualObject(ds.RenderAs, dp, property, newValue, false); } } // ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; case RenderAs.Bubble: foreach (DataSeries ds in selectedDataSeries4Rendering) { foreach (DataPoint dp in ds.InternalDataPoints) { RenderHelper.UpdateVisualObject(ds.RenderAs, dp, property, newValue, false); } } // ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); // BubbleChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); //renderedCanvas = BubbleChart.GetVisualObjectForBubbleChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.Area: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); // AreaChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); //renderedCanvas = AreaChart.GetVisualObjectForAreaChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.StackedColumn: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); //ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); //renderedCanvas = ColumnChart.GetVisualObjectForStackedColumnChart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedColumn100: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); //ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); //renderedCanvas = ColumnChart.GetVisualObjectForStackedColumn100Chart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedBar: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); //ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); //renderedCanvas = BarChart.GetVisualObjectForStackedBarChart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedBar100: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); //ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); //renderedCanvas = BarChart.GetVisualObjectForStackedBar100Chart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.Pie: //renderedCanvas = PieChart.GetVisualObjectForPieChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.Doughnut: //renderedCanvas = PieChart.GetVisualObjectForDoughnutChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.StackedArea: //renderedCanvas = AreaChart.GetVisualObjectForStackedAreaChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.StackedArea100: //renderedCanvas = AreaChart.GetVisualObjectForStackedArea100Chart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.SectionFunnel: // renderedCanvas = FunnelChart.GetVisualObjectForFunnelChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled, false); break; case RenderAs.StreamLineFunnel: //renderedCanvas = FunnelChart.GetVisualObjectForFunnelChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled, true); break; case RenderAs.Stock: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); //StockChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); // renderedCanvas = StockChart.GetVisualObjectForStockChart(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.CandleStick: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); // CandleStick.Update(chart, currentRenderAs, selectedDataSeries4Rendering, property, newValue); // renderedCanvas = CandleStick.GetVisualObjectForCandleStick(width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; } //renderedChart = RenderSeriesFromList(selectedDataSeries4Rendering); renderedSeriesCount += selectedDataSeries4Rendering.Count; } chart.ChartArea.AttachScrollEvents(); Visifire.Charts.Chart.SelectDataPoints(chart); //AttachEventsToolTipHref2DataSeries(); }
internal static Panel GetVisualObject(Panel preExistingPanel, RenderAs chartType, Double width, Double height, PlotDetails plotDetails, List <DataSeries> dataSeriesList4Rendering, Chart chart, Double plankDepth, bool animationEnabled) { Panel renderedCanvas = null; switch (chartType) { case RenderAs.Column: renderedCanvas = ColumnChart.GetVisualObjectForColumnChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.Bar: renderedCanvas = ColumnChart.GetVisualObjectForColumnChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); //renderedCanvas = BarChart.GetVisualObjectForBarChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.Line: renderedCanvas = LineChart.GetVisualObjectForLineChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.Point: renderedCanvas = PointChart.GetVisualObjectForPointChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.Bubble: renderedCanvas = BubbleChart.GetVisualObjectForBubbleChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.Area: renderedCanvas = AreaChart.GetVisualObjectForAreaChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.StackedColumn: renderedCanvas = ColumnChart.GetVisualObjectForStackedColumnChart(chartType, preExistingPanel, width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedColumn100: renderedCanvas = ColumnChart.GetVisualObjectForStackedColumnChart(chartType, preExistingPanel, width, height, plotDetails, chart, plankDepth, animationEnabled); //renderedCanvas = ColumnChart.GetVisualObjectForStackedColumn100Chart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedBar: renderedCanvas = BarChart.GetVisualObjectForStackedBarChart(chartType, preExistingPanel, width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.StackedBar100: renderedCanvas = BarChart.GetVisualObjectForStackedBarChart(chartType, preExistingPanel, width, height, plotDetails, chart, plankDepth, animationEnabled); // renderedCanvas = BarChart.GetVisualObjectForStackedBar100Chart(width, height, plotDetails, chart, plankDepth, animationEnabled); break; case RenderAs.Pie: renderedCanvas = PieChart.GetVisualObjectForPieChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.Doughnut: renderedCanvas = PieChart.GetVisualObjectForDoughnutChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.StackedArea: renderedCanvas = AreaChart.GetVisualObjectForStackedAreaChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.StackedArea100: renderedCanvas = AreaChart.GetVisualObjectForStackedArea100Chart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.SectionFunnel: renderedCanvas = FunnelChart.GetVisualObjectForFunnelChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled, false); break; case RenderAs.StreamLineFunnel: renderedCanvas = FunnelChart.GetVisualObjectForFunnelChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled, true); break; case RenderAs.Stock: renderedCanvas = StockChart.GetVisualObjectForStockChart(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; case RenderAs.CandleStick: renderedCanvas = CandleStick.GetVisualObjectForCandleStick(preExistingPanel, width, height, plotDetails, dataSeriesList4Rendering, chart, plankDepth, animationEnabled); break; } return(renderedCanvas); }
private static void UpdateDataPoint(DataPoint dataPoint, VcProperties property, object newValue, Boolean isAxisChanged) { Chart chart = dataPoint.Chart as Chart; if (chart == null) { return; } DataSeries dataSeries = dataPoint.Parent; PlotGroup plotGroup = dataSeries.PlotGroup; Faces dsFaces = dataSeries.Faces; Faces dpFaces = dataPoint.Faces; Double dataPointWidth; if (dsFaces != null) { ColumnChart.UpdateParentVisualCanvasSize(chart, dsFaces.Visual as Canvas); } if (dpFaces != null && dpFaces.Visual != null) { dataPointWidth = dpFaces.Visual.Width; } else if (dsFaces == null) { return; } else { dataPointWidth = CalculateDataPointWidth(dsFaces.Visual.Width, dsFaces.Visual.Height, chart); } if (property == VcProperties.Enabled || (dpFaces == null && (property == VcProperties.XValue || property == VcProperties.YValues))) { CreateOrUpdateACandleStick(dataPoint, dsFaces.Visual as Canvas, dsFaces.LabelCanvas, dsFaces.Visual.Width, dsFaces.Visual.Height, dataPointWidth); return; } if (dpFaces == null) { return; } switch (property) { case VcProperties.BorderThickness: ApplyOrUpdateBorder(dataPoint, dataPointWidth); ApplyOrRemoveBevel(dataPoint, dataPointWidth); break; case VcProperties.BorderStyle: ApplyOrUpdateBorder(dataPoint, dataPointWidth); break; case VcProperties.BorderColor: ApplyOrUpdateBorder(dataPoint, dataPointWidth); break; case VcProperties.Bevel: ApplyOrRemoveBevel(dataPoint, dataPointWidth); break; case VcProperties.Color: case VcProperties.PriceUpColor: case VcProperties.PriceDownColor: case VcProperties.StickColor: ApplyOrUpdateColorForACandleStick(dataPoint); break; case VcProperties.Cursor: dataPoint.SetCursor2DataPointVisualFaces(); break; case VcProperties.Href: dataPoint.SetHref2DataPointVisualFaces(); break; case VcProperties.HrefTarget: dataPoint.SetHref2DataPointVisualFaces(); break; case VcProperties.LabelBackground: case VcProperties.LabelEnabled: case VcProperties.LabelFontColor: case VcProperties.LabelFontFamily: case VcProperties.LabelFontStyle: case VcProperties.LabelFontSize: case VcProperties.LabelFontWeight: case VcProperties.LabelStyle: case VcProperties.LabelText: CreateAndPositionLabel(dsFaces.LabelCanvas, dataPoint); break; case VcProperties.LegendText: chart.InvokeRender(); break; case VcProperties.LightingEnabled: ApplyOrUpdateColorForACandleStick(dataPoint); break; //case VcProperties.MarkerBorderColor: //case VcProperties.MarkerBorderThickness: //case VcProperties.MarkerColor: //case VcProperties.MarkerEnabled: //case VcProperties.MarkerScale: //case VcProperties.MarkerSize: //case VcProperties.MarkerType: case VcProperties.ShadowEnabled: ApplyOrRemoveShadow(dataPoint, dataPointWidth); break; case VcProperties.Opacity: dpFaces.Visual.Opacity = (Double)dataSeries.Opacity * (Double)dataPoint.Opacity; break; case VcProperties.ShowInLegend: chart.InvokeRender(); break; case VcProperties.ToolTipText: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); break; case VcProperties.XValueFormatString: case VcProperties.YValueFormatString: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); CreateAndPositionLabel(dsFaces.LabelCanvas, dataPoint); break; case VcProperties.XValueType: chart.InvokeRender(); break; case VcProperties.Enabled: CreateOrUpdateACandleStick(dataPoint, dsFaces.Visual as Canvas, dsFaces.LabelCanvas, dsFaces.Visual.Width, dsFaces.Visual.Height, dataPointWidth); break; case VcProperties.XValue: case VcProperties.YValue: case VcProperties.YValues: if (isAxisChanged || dataPoint.InternalYValues == null) { UpdateDataSeries(dataSeries, property, newValue, isAxisChanged); } else { dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); UpdateYValueAndXValuePosition(dataPoint, dsFaces.Visual.Width, dsFaces.Visual.Height, dpFaces.Visual.Width); if ((Boolean)dataPoint.LabelEnabled) { CreateAndPositionLabel(dsFaces.LabelCanvas, dataPoint); } } if (dataPoint.Parent.SelectionEnabled && dataPoint.Selected) { dataPoint.Select(true); } break; } }
private static void UpdateDataPoint(DataPoint dataPoint, VcProperties property, object newValue, Boolean isAxisChanged) { Chart chart = dataPoint.Chart as Chart; DataSeries dataSeries = dataPoint.Parent; PlotGroup plotGroup = dataSeries.PlotGroup; Faces dsFaces = dataSeries.Faces; Faces dpFaces = dataPoint.Faces; Double dataPointWidth; if (dsFaces != null) { ColumnChart.UpdateParentVisualCanvasSize(chart, dsFaces.Visual as Canvas); } if (dpFaces != null && dpFaces.Visual != null) { dataPointWidth = dpFaces.Visual.Width; } else if (dsFaces == null) { return; } else { dataPointWidth = CandleStick.CalculateDataPointWidth(dsFaces.Visual.Width, dsFaces.Visual.Height, chart); } if (property == VcProperties.Enabled) { CreateOrUpdateAStockDataPoint(dataPoint, dsFaces.Visual as Canvas, dsFaces.LabelCanvas, dsFaces.Visual.Width, dsFaces.Visual.Height, dataPointWidth); return; } if (dpFaces == null) { return; } Canvas dataPointVisual = dpFaces.Visual as Canvas; // DataPoint visual canvas Line highLowLine = dpFaces.VisualComponents[0] as Line; // HighLowline Line closeLine = dpFaces.VisualComponents[1] as Line; // Closeline Line openLine = dpFaces.VisualComponents[2] as Line; // Openline switch (property) { case VcProperties.BorderThickness: case VcProperties.BorderStyle: ApplyBorderProperties(dataPoint, highLowLine, openLine, closeLine, dataPointWidth); break; case VcProperties.Color: ApplyOrUpdateColorForAStockDp(dataPoint, highLowLine, openLine, closeLine); break; case VcProperties.Cursor: dataPoint.SetCursor2DataPointVisualFaces(); break; case VcProperties.Href: dataPoint.SetHref2DataPointVisualFaces(); break; case VcProperties.HrefTarget: dataPoint.SetHref2DataPointVisualFaces(); break; case VcProperties.LabelBackground: case VcProperties.LabelEnabled: case VcProperties.LabelFontColor: case VcProperties.LabelFontFamily: case VcProperties.LabelFontStyle: case VcProperties.LabelFontSize: case VcProperties.LabelFontWeight: case VcProperties.LabelStyle: case VcProperties.LabelText: CandleStick.CreateAndPositionLabel(dsFaces.LabelCanvas, dataPoint); break; case VcProperties.LegendText: chart.InvokeRender(); break; case VcProperties.LightingEnabled: ApplyOrUpdateColorForAStockDp(dataPoint, highLowLine, openLine, closeLine); break; //case VcProperties.MarkerBorderColor: //case VcProperties.MarkerBorderThickness: //case VcProperties.MarkerColor: //case VcProperties.MarkerEnabled: //case VcProperties.MarkerScale: //case VcProperties.MarkerSize: //case VcProperties.MarkerType: case VcProperties.ShadowEnabled: ApplyOrUpdateShadow(dataPoint, dataPointVisual, highLowLine, openLine, closeLine, dataPointWidth); break; case VcProperties.Opacity: dpFaces.Visual.Opacity = dataSeries.Opacity * dataPoint.Opacity; break; case VcProperties.ShowInLegend: chart.InvokeRender(); break; case VcProperties.ToolTipText: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); break; case VcProperties.XValueFormatString: case VcProperties.YValueFormatString: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); CandleStick.CreateAndPositionLabel(dsFaces.LabelCanvas, dataPoint); break; case VcProperties.XValueType: chart.InvokeRender(); break; case VcProperties.Enabled: CreateOrUpdateAStockDataPoint(dataPoint, dsFaces.Visual as Canvas, dsFaces.LabelCanvas, dsFaces.Visual.Width, dsFaces.Visual.Height, dataPointWidth); break; case VcProperties.XValue: case VcProperties.YValues: if (isAxisChanged) { UpdateDataSeries(dataSeries, property, newValue, isAxisChanged); } else { dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); UpdateYValueAndXValuePosition(dataPoint, dsFaces.Visual.Width, dsFaces.Visual.Height, dpFaces.Visual.Width); if ((Boolean)dataPoint.LabelEnabled) { CandleStick.CreateAndPositionLabel(dsFaces.LabelCanvas, dataPoint); } } if (dataPoint.Parent.SelectionEnabled && dataPoint.Selected) { dataPoint.Select(true); } break; } }
/// <summary> /// Creates visual object for a StackedColumn /// </summary> /// <param name="isPositive">Whether the DataPoint YValue is greater than or equals to 0.</param> /// <param name="columnCanvas"></param> /// <param name="labelCanvas"></param> /// <param name="dataPoint"></param> /// <param name="isTopOFStack"></param> /// <param name="left"></param> /// <param name="top"></param> /// <param name="bottom"></param> /// <param name="columnWidth"></param> /// <param name="depth3d"></param> /// <param name="prevSum"></param> /// <param name="positiveOrNegativeIndex"></param> /// <param name="animationEnabled"></param> private static void CreateStackedColumnVisual(Boolean isPositive, Canvas columnCanvas, Canvas labelCanvas, DataPoint dataPoint, Boolean isTopOFStack, Double left, ref Double top, ref Double bottom, Double columnWidth, Double columnHeight, Double depth3d, ref Int32 positiveOrNegativeIndex, Boolean animationEnabled, Double animationBeginTime) { PlotGroup plotGroup = dataPoint.Parent.PlotGroup; Chart chart = dataPoint.Chart as Chart; Faces column; Panel columnVisual = null; dataPoint.Parent.Faces = new Faces { Visual = columnCanvas, LabelCanvas = labelCanvas }; if (chart.View3D) { column = ColumnChart.Get3DColumn(dataPoint, columnWidth, columnHeight, depth3d, dataPoint.Color, null, null, null, (Boolean)dataPoint.LightingEnabled, (BorderStyles)dataPoint.BorderStyle, dataPoint.BorderColor, dataPoint.BorderThickness.Left); columnVisual = column.Visual as Panel; columnVisual.SetValue(Canvas.ZIndexProperty, ColumnChart.GetStackedColumnZIndex(left, top, (dataPoint.InternalYValue > 0), positiveOrNegativeIndex)); dataPoint.Faces = column; ColumnChart.ApplyOrRemoveShadow(dataPoint, true, false); } else { column = ColumnChart.Get2DColumn(dataPoint, columnWidth, columnHeight, true, false); columnVisual = column.Visual as Panel; } dataPoint.Faces = column; dataPoint.Faces.LabelCanvas = labelCanvas; columnVisual.SetValue(Canvas.LeftProperty, left); columnVisual.SetValue(Canvas.TopProperty, top); columnCanvas.Children.Add(columnVisual); dataPoint.IsTopOfStack = isTopOFStack; CreateOrUpdateMarker4VerticalChart(dataPoint, labelCanvas, new Size(columnVisual.Width, columnVisual.Height), left, top); // labelCanvas.Children.Add(GetMarker(chart, columnParams, dataPoint, left, top)); DataSeries currentDataSeries; // Apply animation if (animationEnabled) { currentDataSeries = dataPoint.Parent; if (currentDataSeries.Storyboard == null) { currentDataSeries.Storyboard = new Storyboard(); } // Apply animation to the data points dataSeriesIndex.e to the rectangles that form the columns currentDataSeries.Storyboard = ApplyStackedColumnChartAnimation(currentDataSeries, columnVisual, dataPoint.Parent.Storyboard, animationBeginTime, 0.5); } if (isPositive) { bottom = top; } else { top = bottom; } dataPoint.Faces.Visual.Opacity = dataPoint.Opacity * dataPoint.Parent.Opacity; dataPoint.AttachEvent2DataPointVisualFaces(dataPoint); dataPoint.AttachEvent2DataPointVisualFaces(dataPoint.Parent); dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); //dataPoint.AttachToolTip(chart, dataPoint, dataPoint.Faces.VisualComponents); //dataPoint.AttachHref(chart, dataPoint.Faces.VisualComponents, dataPoint.Href, (HrefTargets)dataPoint.HrefTarget); dataPoint.AttachToolTip(chart, dataPoint, dataPoint.Faces.Visual); dataPoint.AttachHref(chart, dataPoint.Faces.Visual, dataPoint.Href, (HrefTargets)dataPoint.HrefTarget); dataPoint.SetCursor2DataPointVisualFaces(); }
/// <summary> /// Get visual object for stacked column chart /// </summary> /// <param name="width">Width of the PlotArea</param> /// <param name="height">Height of the PlotArea</param> /// <param name="plotDetails">PlotDetails</param> /// <param name="chart">Chart</param> /// <param name="plankDepth">PlankDepth</param> /// <param name="animationEnabled">Whether animation is enabled for chart</param> /// <returns>StackedColumn chart canvas</returns> internal static Canvas GetVisualObjectForStackedColumnChart(RenderAs chartType, Panel preExistingPanel, Double width, Double height, PlotDetails plotDetails, Chart chart, Double plankDepth, bool animationEnabled) { if (Double.IsNaN(width) || Double.IsNaN(height) || width <= 0 || height <= 0) { return(null); } Canvas visual, labelCanvas, columnCanvas; RenderHelper.RepareCanvas4Drawing(preExistingPanel as Canvas, out visual, out labelCanvas, out columnCanvas, width, height); List <PlotGroup> plotGroupList = (from plots in plotDetails.PlotGroups where plots.RenderAs == chartType select plots).ToList(); Double depth3d = plankDepth / plotDetails.Layer3DCount * (chart.View3D ? 1 : 0); Double visualOffset = depth3d * (plotDetails.SeriesDrawingIndex[plotGroupList[0].DataSeriesList[0]] + 1); visual.SetValue(Canvas.TopProperty, visualOffset); visual.SetValue(Canvas.LeftProperty, -visualOffset); List <DataSeries> seriesList = plotDetails.GetSeriesListByRenderAs(chartType); Dictionary <Axis, Dictionary <Axis, Int32> > seriesIndex = ColumnChart.GetSeriesIndex(seriesList); Double minDiff, widthPerColumn, maxColumnWidth; DataSeries currentDataSeries = null; foreach (PlotGroup plotGroup in plotGroupList) { if (!seriesIndex.ContainsKey(plotGroup.AxisY)) { continue; } currentDataSeries = plotGroup.DataSeriesList[0]; List <Double> xValuesList = plotGroup.XWiseStackedDataList.Keys.ToList(); plotGroup.DrawingIndex = seriesIndex[plotGroup.AxisY][plotGroup.AxisX]; widthPerColumn = CalculateWidthOfEachStackedColumn(chart, plotGroup, width, out minDiff, out maxColumnWidth); Double limitingYValue = 0; if (plotGroup.AxisY.InternalAxisMinimum > 0) { limitingYValue = (Double)plotGroup.AxisY.InternalAxisMinimum; } if (plotGroup.AxisY.InternalAxisMaximum < 0) { limitingYValue = (Double)plotGroup.AxisY.InternalAxisMaximum; } foreach (Double xValue in xValuesList) { DrawStackedColumnsAtXValue(chartType, xValue, plotGroup, columnCanvas, labelCanvas, plotGroup.DrawingIndex, widthPerColumn, maxColumnWidth, limitingYValue, depth3d, animationEnabled); } } // Apply animation if (animationEnabled && currentDataSeries != null) { if (currentDataSeries.Storyboard == null) { currentDataSeries.Storyboard = new Storyboard(); } // Apply animation to the marker and labels currentDataSeries.Storyboard = AnimationHelper.ApplyOpacityAnimation(labelCanvas, currentDataSeries, currentDataSeries.Storyboard, 1, 1, 0, 1); } ColumnChart.CreateOrUpdatePlank(chart, plotGroupList[0].AxisY, columnCanvas, depth3d, Orientation.Horizontal); // Remove old visual and add new visual in to the existing panel if (preExistingPanel != null) { visual.Children.RemoveAt(1); visual.Children.Add(columnCanvas); } else { labelCanvas.SetValue(Canvas.ZIndexProperty, 1); visual.Children.Add(labelCanvas); visual.Children.Add(columnCanvas); } RectangleGeometry clipRectangle = new RectangleGeometry(); clipRectangle.Rect = new Rect(0, -chart.ChartArea.PLANK_DEPTH - (chart.View3D ? 0 : 5), width + chart.ChartArea.PLANK_DEPTH, height + chart.ChartArea.PLANK_DEPTH + chart.ChartArea.PLANK_THICKNESS + (chart.View3D ? 0 : 10)); visual.Clip = clipRectangle; return(visual); }
internal static void UpdateVisualObject(RenderAs chartType, Visifire.Commons.ObservableObject sender, VcProperties property, object newValue, Boolean isAXisChanged) { Boolean isDataPoint = sender.GetType().Equals(typeof(DataPoint)); DataPoint dataPoint = sender as DataPoint; Chart chart = (sender as ObservableObject).Chart as Chart; switch (chartType) { case RenderAs.Column: case RenderAs.Bar: ColumnChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.Line: case RenderAs.Spline: LineChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.QuickLine: QuickLineChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.StepLine: StepLineChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.Point: PointChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.Bubble: BubbleChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.Area: AreaChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.StackedColumn: ColumnChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.StackedColumn100: ColumnChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.StackedBar: ColumnChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.StackedBar100: ColumnChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.Pie: //renderedCanvas = PieChart.GetVisualObjectForPieChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.Doughnut: //renderedCanvas = PieChart.GetVisualObjectForDoughnutChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.StackedArea: List <DataSeries> stackedAreaList = (from ds in chart.Series where ds.RenderAs == RenderAs.StackedArea select ds).ToList(); if (stackedAreaList.Count > 0) { ColumnChart.Update(chart, stackedAreaList[0].RenderAs, stackedAreaList); } chart.ChartArea.AttachEventsToolTipHref2DataSeries(); break; case RenderAs.StackedArea100: List <DataSeries> stackedArea100List = (from ds in chart.Series where ds.RenderAs == RenderAs.StackedArea select ds).ToList(); if (stackedArea100List.Count > 0) { ColumnChart.Update(chart, stackedArea100List[0].RenderAs, stackedArea100List); } chart.ChartArea.AttachEventsToolTipHref2DataSeries(); break; case RenderAs.SectionFunnel: case RenderAs.StreamLineFunnel: case RenderAs.Pyramid: //renderedCanvas = FunnelChart.GetVisualObjectForFunnelChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled, true); break; case RenderAs.Stock: StockChart.Update(sender, property, newValue, isAXisChanged); break; case RenderAs.CandleStick: CandleStick.Update(sender, property, newValue, isAXisChanged); break; } //chart.ChartArea.AttachScrollEvents(); }
internal static void UpdateVisualObject(Chart chart, VcProperties property, object newValue, Boolean partialUpdate) { if (!chart._internalPartialUpdateEnabled || Double.IsNaN(chart.ActualWidth) || Double.IsNaN(chart.ActualHeight) || chart.ActualWidth == 0 || chart.ActualHeight == 0) { return; } if (partialUpdate && chart._datapoint2UpdatePartially.Count <= 500) { chart.PARTIAL_DP_RENDER_LOCK = false; Boolean isNeed2UpdateAllSeries = false; List <DataSeries> _dataSeries2UpdateAtSeriesWise = (from value in chart._datapoint2UpdatePartially where value.Key.Parent.RenderAs == RenderAs.Spline || value.Key.Parent.RenderAs == RenderAs.QuickLine select value.Key.Parent).Distinct().ToList(); foreach (DataSeries splineDs in _dataSeries2UpdateAtSeriesWise) { splineDs.UpdateVisual(VcProperties.DataPointUpdate, null); } List <KeyValuePair <DataPoint, VcProperties> > remainingDpInfo = (from dpInfo in chart._datapoint2UpdatePartially where !_dataSeries2UpdateAtSeriesWise.Contains(dpInfo.Key.Parent) select dpInfo).ToList(); // If there is nothing to render anymore if (remainingDpInfo.Count == 0) { return; } foreach (KeyValuePair <DataPoint, VcProperties> dpInfo in remainingDpInfo) { DataPoint dp = dpInfo.Key; if (dp.Parent.RenderAs == RenderAs.Spline || dp.Parent.RenderAs == RenderAs.QuickLine) { isNeed2UpdateAllSeries = false; continue; } if (dpInfo.Value == VcProperties.XValue) { isNeed2UpdateAllSeries = true; break; } PropertyInfo pInfo = dp.GetType().GetProperty(dpInfo.Value.ToString()); newValue = pInfo.GetValue(dp, null); isNeed2UpdateAllSeries = dpInfo.Key.UpdateVisual(dpInfo.Value, newValue, true); if (isNeed2UpdateAllSeries) { break; } } if (!isNeed2UpdateAllSeries) { return; } } chart.ChartArea.PrePartialUpdateConfiguration(chart, Visifire.Charts.ElementTypes.Chart, VcProperties.None, null, null, false, true, true, AxisRepresentations.AxisY, true); Int32 renderedSeriesCount = 0; // Contain count of series that have been already rendered // Contains a list of serties as per the drawing order generated in the plotdetails List <DataSeries> dataSeriesListInDrawingOrder = chart.PlotDetails.SeriesDrawingIndex.Keys.ToList(); List <DataSeries> selectedDataSeries4Rendering; // Contains a list of serries to be rendered in a rendering cycle Int32 currentDrawingIndex; // Drawing index of the selected series RenderAs currentRenderAs; // Rendereas type of the selected series // This loop will select series for rendering and it will repeat until all series have been rendered while (renderedSeriesCount < chart.InternalSeries.Count) { selectedDataSeries4Rendering = new List <DataSeries>(); currentRenderAs = dataSeriesListInDrawingOrder[renderedSeriesCount].RenderAs; currentDrawingIndex = chart.PlotDetails.SeriesDrawingIndex[dataSeriesListInDrawingOrder[renderedSeriesCount]]; for (Int32 i = renderedSeriesCount; i < chart.InternalSeries.Count; i++) { DataSeries ds = dataSeriesListInDrawingOrder[i]; if (currentRenderAs == ds.RenderAs && currentDrawingIndex == chart.PlotDetails.SeriesDrawingIndex[ds]) { selectedDataSeries4Rendering.Add(ds); } } if (selectedDataSeries4Rendering.Count == 0) { break; } chart._toolTip.Hide(); if (selectedDataSeries4Rendering.Count > 0) { if (selectedDataSeries4Rendering[0].ToolTipElement != null) { selectedDataSeries4Rendering[0].ToolTipElement.Hide(); } } chart.ChartArea.DisableIndicators(); switch (currentRenderAs) { case RenderAs.Column: case RenderAs.Bar: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; case RenderAs.Spline: case RenderAs.QuickLine: if (property == VcProperties.Enabled) { ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); } else { foreach (DataSeries ds in selectedDataSeries4Rendering) { UpdateVisualObject(ds.RenderAs, ds, property, newValue, false); } } break; case RenderAs.Line: if (property == VcProperties.Enabled) { ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); } else { foreach (DataSeries ds in selectedDataSeries4Rendering) { LineChart.Update(ds, property, newValue, false); } } break; case RenderAs.StepLine: if (property == VcProperties.Enabled) { ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); } else { foreach (DataSeries ds in selectedDataSeries4Rendering) { StepLineChart.Update(ds, property, newValue, false); } } break; case RenderAs.Point: if (property == VcProperties.ViewportRangeEnabled) { ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); } else { foreach (DataSeries ds in selectedDataSeries4Rendering) { PointChart.Update(ds, property, newValue, false); } } break; case RenderAs.Bubble: if (property == VcProperties.ViewportRangeEnabled) { ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); } else { foreach (DataSeries ds in selectedDataSeries4Rendering) { BubbleChart.Update(ds, property, newValue, false); } } break; case RenderAs.Area: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; case RenderAs.StackedColumn: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; case RenderAs.StackedColumn100: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; case RenderAs.StackedBar: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; case RenderAs.StackedBar100: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; case RenderAs.Pie: //renderedCanvas = PieChart.GetVisualObjectForPieChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.Doughnut: //renderedCanvas = PieChart.GetVisualObjectForDoughnutChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled); break; case RenderAs.StackedArea: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); chart.ChartArea.AttachEventsToolTipHref2DataSeries(); break; case RenderAs.StackedArea100: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); chart.ChartArea.AttachEventsToolTipHref2DataSeries(); break; case RenderAs.SectionFunnel: case RenderAs.StreamLineFunnel: case RenderAs.Pyramid: //renderedCanvas = FunnelChart.GetVisualObjectForFunnelChart(width, height, plotDetails, dataSeriesList4Rendering, chart, animationEnabled, true); break; case RenderAs.Stock: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; case RenderAs.CandleStick: ColumnChart.Update(chart, currentRenderAs, selectedDataSeries4Rendering); break; } renderedSeriesCount += selectedDataSeries4Rendering.Count; } chart.ChartArea.AttachScrollBarOffsetChangedEventWithAxes(); chart.ChartArea.AttachOrDetachIntaractivity(chart.InternalSeries); Visifire.Charts.Chart.SelectDataPoints(chart); //AttachEventsToolTipHref2DataSeries(); }
/// <summary> /// /// </summary> /// <param name="dataPoint"></param> /// <param name="property"></param> /// <param name="newValue"></param> /// <param name="isAxisChanged"></param> private static void UpdateDataPoint(DataPoint dataPoint, VcProperties property, object newValue, Boolean isAxisChanged) { Chart chart = dataPoint.Chart as Chart; if (chart == null) { return; } PlotDetails plotDetails = chart.PlotDetails; Marker marker = dataPoint.Marker; DataSeries dataSeries = dataPoint.Parent; if (dataSeries.Faces == null) { return; } Canvas bubleChartCanvas = dataSeries.Faces.Visual as Canvas; Double plotHeight = chart.ChartArea.ChartVisualCanvas.Height; Double plotWidth = chart.ChartArea.ChartVisualCanvas.Width; Double minimumZVal, maximumZVal; ColumnChart.UpdateParentVisualCanvasSize(chart, bubleChartCanvas); if (property == VcProperties.Enabled || ((dataPoint.Faces == null || Double.IsNaN(dataPoint.InternalYValue)) && (property == VcProperties.XValue || property == VcProperties.YValue))) { dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); // Calculate max and min ZValue from all DataSeries List <DataSeries> seriesList = (from ds in chart.InternalSeries where ds.RenderAs == RenderAs.Bubble && ((Boolean)ds.Enabled == true) select ds).ToList(); CalculateMaxAndMinZValueFromAllSeries(ref seriesList, out minimumZVal, out maximumZVal); CreateOrUpdateAPointDataPoint(bubleChartCanvas, dataPoint, minimumZVal, maximumZVal, plotWidth, plotHeight); return; } if (dataPoint.Faces == null) { return; } Grid bubbleVisual = dataPoint.Faces.Visual as Grid; switch (property) { case VcProperties.Bevel: break; case VcProperties.Cursor: break; case VcProperties.Href: dataPoint.SetHref2DataPointVisualFaces(); break; case VcProperties.HrefTarget: dataPoint.SetHref2DataPointVisualFaces(); break; case VcProperties.LabelBackground: if (marker != null) { marker.TextBackground = dataPoint.LabelBackground; } break; case VcProperties.LabelEnabled: CalculateMaxAndMinZValue(dataPoint.Parent, out minimumZVal, out maximumZVal); CreateOrUpdateAPointDataPoint(bubleChartCanvas, dataPoint, minimumZVal, maximumZVal, plotWidth, plotHeight); // if (marker != null) // marker.LabelEnabled = (Boolean)dataPoint.LabelEnabled; break; case VcProperties.LabelFontColor: if (marker != null) { marker.FontColor = dataPoint.LabelFontColor; } break; case VcProperties.LabelFontFamily: if (marker != null) { marker.FontFamily = dataPoint.LabelFontFamily; } break; case VcProperties.LabelFontStyle: if (marker != null) { marker.FontStyle = (FontStyle)dataPoint.LabelFontStyle; } break; //case VcProperties.LabelFontSize: // if (marker != null) // marker.FontSize = (Double)dataPoint.LabelFontSize; // break; case VcProperties.LabelFontWeight: if (marker != null) { marker.FontWeight = (FontWeight)dataPoint.LabelFontWeight; } break; case VcProperties.LabelAngle: if (marker != null) { marker.FontWeight = (FontWeight)dataPoint.LabelFontWeight; } break; case VcProperties.LegendText: chart.InvokeRender(); break; case VcProperties.Color: case VcProperties.LightingEnabled: if (marker != null) { marker.MarkerShape.Fill = (chart.View3D ? Graphics.Get3DBrushLighting(dataPoint.Color, (Boolean)dataPoint.LightingEnabled) : ((Boolean)dataPoint.LightingEnabled ? Graphics.GetLightingEnabledBrush(dataPoint.Color, "Linear", null) : dataPoint.Color)); } break; case VcProperties.MarkerBorderColor: if (marker != null) { marker.BorderColor = dataPoint.MarkerBorderColor; } break; case VcProperties.MarkerBorderThickness: if (marker != null) { marker.BorderThickness = dataPoint.MarkerBorderThickness.Value.Left; } break; case VcProperties.XValueFormatString: case VcProperties.YValueFormatString: case VcProperties.LabelFontSize: case VcProperties.LabelStyle: case VcProperties.LabelText: case VcProperties.MarkerScale: case VcProperties.MarkerSize: case VcProperties.MarkerType: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); CalculateMaxAndMinZValue(dataPoint.Parent, out minimumZVal, out maximumZVal); CreateOrUpdateAPointDataPoint(bubleChartCanvas, dataPoint, minimumZVal, maximumZVal, plotWidth, plotHeight); break; case VcProperties.ShadowEnabled: if (marker != null) { marker.ShadowEnabled = (Boolean)dataPoint.ShadowEnabled; marker.ApplyRemoveShadow(); } break; case VcProperties.Opacity: if (marker != null) { marker.Visual.Opacity = (Double)dataPoint.Opacity * (Double)dataSeries.Opacity; } break; case VcProperties.ShowInLegend: chart.InvokeRender(); break; case VcProperties.ToolTipText: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); break; case VcProperties.XValueType: chart.InvokeRender(); break; case VcProperties.XValue: case VcProperties.YValue: case VcProperties.YValues: case VcProperties.DataPoints: if (isAxisChanged) { UpdateDataSeries(dataSeries, property, newValue, false); } else if (marker != null) { dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); if ((Boolean)dataPoint.LabelEnabled) { marker.Text = dataPoint.TextParser(dataPoint.LabelText); } UpdateBubblePositionAccording2XandYValue(dataPoint, plotWidth, plotHeight, (Boolean)chart.AnimatedUpdate, marker.MarkerShape.Width, marker.MarkerShape.Width); } break; case VcProperties.ZValue: dataPoint._parsedToolTipText = dataPoint.TextParser(dataPoint.ToolTipText); //if ((Boolean)dataPoint.LabelEnabled) // marker.Text = dataPoint.TextParser(dataPoint.LabelText); List <DataSeries> seriesList = (from ds in chart.InternalSeries where ds.RenderAs == RenderAs.Bubble && ((Boolean)ds.Enabled == true) select ds).ToList(); CalculateMaxAndMinZValueFromAllSeries(ref seriesList, out minimumZVal, out maximumZVal); // CalculateMaxAndMinZValue(dataPoint.Parent, out minimumZVal, out maximumZVal); foreach (DataSeries ds in seriesList) { foreach (DataPoint dp in ds.InternalDataPoints) { if (Double.IsNaN(dp.InternalYValue) || (dp.Enabled == false)) { continue; } ApplyZValue(dp, minimumZVal, maximumZVal, plotWidth, plotHeight); } } break; } if (bubleChartCanvas.Parent != null) { RectangleGeometry clipRectangle = new RectangleGeometry(); clipRectangle.Rect = new Rect(0, -(dataPoint.Chart as Chart).ChartArea.PLANK_DEPTH, plotWidth + (dataPoint.Chart as Chart).ChartArea.PLANK_OFFSET, plotHeight + (dataPoint.Chart as Chart).ChartArea.PLANK_DEPTH); (bubleChartCanvas.Parent as Canvas).Clip = clipRectangle; } }