diff --git a/samples/Blazor.Toolkit.Samples.Client/Layout/MainLayout.razor b/samples/Blazor.Toolkit.Samples.Client/Layout/MainLayout.razor index b26e9c6..26a26e5 100644 --- a/samples/Blazor.Toolkit.Samples.Client/Layout/MainLayout.razor +++ b/samples/Blazor.Toolkit.Samples.Client/Layout/MainLayout.razor @@ -585,7 +585,7 @@ .main-area { flex: 1; - max-width: calc(100% - 600px); + max-width: 100%; padding: 32px 48px; background-color: var(--bg-color); } diff --git a/samples/Blazor.Toolkit.Samples.Client/Pages/Components/Charts/GettingStarted.razor b/samples/Blazor.Toolkit.Samples.Client/Pages/Components/Charts/GettingStarted.razor index 72000d2..5471d39 100644 --- a/samples/Blazor.Toolkit.Samples.Client/Pages/Components/Charts/GettingStarted.razor +++ b/samples/Blazor.Toolkit.Samples.Client/Pages/Components/Charts/GettingStarted.razor @@ -167,7 +167,7 @@ new SalesInfo { Month = "Jul", SalesValue = 35 } }; - private string ProgramCode = @"@using Syncfusion.Blazor.Toolkit; + private string ProgramCode = @"using Syncfusion.Blazor.Toolkit; var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorComponents().AddInteractiveServerComponents(); diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/ColumnBase.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/ColumnBase.cs index 45df677..a9cd4ba 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/ColumnBase.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/ColumnBase.cs @@ -44,7 +44,10 @@ private static void FindRectPosition(List seriesCollection) for (int i = 0; i < seriesCollection.Count; i++) { - seriesCollection[i].Renderer.RectCount = visibleSeries.RectCount; + if (seriesCollection[i].Renderer is { } renderer) + { + renderer.RectCount = visibleSeries.RectCount; + } } } @@ -58,6 +61,11 @@ private static void AssignPositions(List seriesCollection, Dictiona { for (int i = 0; i < seriesCollection.Count; i++) { + if (seriesCollection[i].Renderer is not { } renderer) + { + continue; + } + string seriesType = seriesCollection[i].SeriesType ?? null!; if (seriesType.Contains("Stacking", StringComparison.InvariantCulture) || !string.IsNullOrEmpty(seriesCollection[i].GroupName)) { @@ -71,30 +79,30 @@ private static void AssignPositions(List seriesCollection, Dictiona if (double.IsNaN(groupingValues[groupName])) { - seriesCollection[i].Renderer.Position = visibleSeries.RectCount; + renderer.Position = visibleSeries.RectCount; groupingValues[groupName] = visibleSeries.RectCount++; } else { - seriesCollection[i].Renderer.Position = groupingValues[groupName]; + renderer.Position = groupingValues[groupName]; } } else { if (double.IsNaN(visibleSeries.Position)) { - seriesCollection[i].Renderer.Position = visibleSeries.RectCount; + renderer.Position = visibleSeries.RectCount; visibleSeries.Position = visibleSeries.RectCount++; } else { - seriesCollection[i].Renderer.Position = visibleSeries.Position; + renderer.Position = visibleSeries.Position; } } } else { - seriesCollection[i].Renderer.Position = visibleSeries.RectCount++; + renderer.Position = visibleSeries.RectCount++; } } } @@ -530,9 +538,9 @@ internal Rect GetColumnWidthInPixelRect(Rect rectangle) { ChartSeriesType.Bar or ChartSeriesType.StackingBar or ChartSeriesType.StackingBar100 => isTransposed ? new Rect(rectangle.X - (halfColumnWidthAdjustment - positionAdjustment), rectangle.Y, columnWidth, rectangle.Height) - : new Rect(rectangle.X, rectangle.Y - (halfColumnWidthAdjustment - (columnWidth * ((double.IsNaN(Series.Renderer?.RectCount ?? 0) ? 0 : Series.Renderer.RectCount) - (double.IsNaN(Series.Renderer.Position) ? 0 : Series.Renderer.Position) - 1))), rectangle.Width, columnWidth), + : new Rect(rectangle.X, rectangle.Y - (halfColumnWidthAdjustment - (columnWidth * ((double.IsNaN(Series.Renderer?.RectCount ?? 0) ? 0 : Series.Renderer?.RectCount ?? 0) - (double.IsNaN(Series.Renderer?.Position ?? 0) ? 0 : Series.Renderer?.Position ?? 0) - 1))), rectangle.Width, columnWidth), ChartSeriesType.Column or ChartSeriesType.StackingColumn or ChartSeriesType.StackingColumn100 => isTransposed - ? new Rect(rectangle.X, rectangle.Y - (halfColumnWidthAdjustment - (columnWidth * ((double.IsNaN(Series.Renderer?.RectCount ?? 0) ? 0 : Series.Renderer.RectCount) - (double.IsNaN(Series.Renderer.Position) ? 0 : Series.Renderer.Position) - 1))), rectangle.Width, columnWidth) + ? new Rect(rectangle.X, rectangle.Y - (halfColumnWidthAdjustment - (columnWidth * ((double.IsNaN(Series.Renderer?.RectCount ?? 0) ? 0 : Series.Renderer?.RectCount ?? 0) - (double.IsNaN(Series.Renderer?.Position ?? 0) ? 0 : Series.Renderer?.Position ?? 0) - 1))), rectangle.Width, columnWidth) : new Rect(rectangle.X - (halfColumnWidthAdjustment - positionAdjustment), rectangle.Y, columnWidth, rectangle.Height), ChartSeriesType.Line => new Rect(), ChartSeriesType.Area => new Rect(), diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/SeriesContainer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/SeriesContainer.cs index 9e4968b..4a95883 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/SeriesContainer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/SeriesContainer.cs @@ -348,11 +348,11 @@ private static Dictionary> FindFrequencies(Li if (!string.IsNullOrEmpty(series.Container?._sorting.SortKey)) { - frequencies[stackingGroup][xVal] += (Convert.ToDouble(series.Renderer.Points?[j].Y, CultureInfo.InvariantCulture) > 0 ? 1 : -1) * Convert.ToDouble(series.Renderer.Points?[j].Y, CultureInfo.InvariantCulture); + frequencies[stackingGroup][xVal] += (Convert.ToDouble(series.Renderer?.Points?[j].Y, CultureInfo.InvariantCulture) > 0 ? 1 : -1) * Convert.ToDouble(series.Renderer?.Points?[j].Y, CultureInfo.InvariantCulture); } else { - frequencies[stackingGroup][xVal] += (series.Renderer.YData[j] > 0 ? 1 : -1) * series.Renderer.YData[j]; + frequencies[stackingGroup][xVal] += (series.Renderer?.YData[j] > 0 ? 1 : -1) * (series.Renderer?.YData[j] ?? 1); } } } diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/SplineBase.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/SplineBase.cs index 50c0ddb..e1b9f4d 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/SplineBase.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/BaseRenderers/SplineBase.cs @@ -78,9 +78,12 @@ private void CreateDrawPoints(List points, ref bool isNegativePoint) } if (data.YValue != 0 && !double.IsNaN(data.YValue) && pointValue?.ControlPoint1.Y != 0 && !double.IsNaN(pointValue?.ControlPoint1.Y ?? 0) && pointValue?.ControlPoint2.Y != 0 && !double.IsNaN(pointValue?.ControlPoint2.Y ?? 0) && Series is not null && ((Series.Renderer?.YMax ?? 0) - (Series.Renderer?.YMin ?? 0)) > 1) { - bool maxValue = Math.Abs(Series.Renderer.YMin - Math.Floor(Series.Renderer.YMin)) > double.Epsilon; - Series.Renderer.YMin = maxValue ? Series.Renderer.YMin : Math.Floor(Math.Min(Math.Min(Series.Renderer.YMin, data.YValue), Math.Min(pointValue.ControlPoint1.Y, pointValue.ControlPoint2.Y))); - Series.Renderer.YMax = Math.Ceiling(Math.Max(Math.Max(Series.Renderer.YMax, data.YValue), Math.Max(pointValue.ControlPoint1.Y, pointValue.ControlPoint2.Y))); + bool maxValue = Math.Abs((Series.Renderer?.YMin ?? 0) - Math.Floor(Series.Renderer?.YMin ?? 0)) > double.Epsilon; + if (Series.Renderer is not null) + { + Series.Renderer.YMin = maxValue ? Series.Renderer.YMin : Math.Floor(Math.Min(Math.Min(Series.Renderer.YMin, data.YValue), Math.Min(pointValue?.ControlPoint1.Y ?? 0, pointValue?.ControlPoint2.Y ?? 0))); + Series.Renderer.YMax = Math.Ceiling(Math.Max(Math.Max(Series.Renderer.YMax, data.YValue), Math.Max(pointValue?.ControlPoint1.Y ?? 0, pointValue?.ControlPoint2.Y ?? 0))); + } } } } @@ -156,7 +159,7 @@ private static void ComputeNaturalOrClampedCoefficients(List points, Char { for (int i = 1; i < count - 1; i++) { - series.Renderer.GetSplineTypePoints(points, i, SplineType.Clamped, isLow); + series.Renderer?.GetSplineTypePoints(points, i, SplineType.Clamped, isLow); } double firstSegmentX = points[1].XValue - points[0].XValue; @@ -199,7 +202,7 @@ private static void ComputeNaturalOrClampedCoefficients(List points, Char y_Spline[count - 1] = 0; } - series.Renderer.GetDefaultSplineTypePoints(points, i, isLow); + series.Renderer?.GetDefaultSplineTypePoints(points, i, isLow); double coefficient1 = points[i].XValue - points[i - 1].XValue; double coefficient2 = points[i + 1].XValue - points[i - 1].XValue; double coefficient3 = points[i + 1].XValue - points[i].XValue; @@ -364,7 +367,7 @@ protected double DateTimeInterval() deltaX2 *= deltaX2; bool shouldUseAbs = Series is not null && - Math.Abs(Series.Renderer.YMin - Math.Floor(Series.Renderer.YMin)) > double.Epsilon && + Math.Abs((Series.Renderer?.YMin ?? 0) - Math.Floor(Series.Renderer?.YMin ?? 0)) > double.Epsilon && double.IsNegative(ONE_THIRD * ((2 * prevdata.YValue) + nextData.YValue - (ONE_THIRD * deltaX2 * (y_Spline1 + (0.5 * y_Spline2))))) && double.IsNegative(ONE_THIRD * (prevdata.YValue + (2 * nextData.YValue) - (ONE_THIRD * deltaX2 * ((0.5 * y_Spline1) + y_Spline2)))); @@ -394,7 +397,7 @@ protected double DateTimeInterval() /// Filtered list of points. internal static List FilterEmptyPoints(ChartSeries series, [Optional] List seriesPoints) { - List points = seriesPoints is not null ? seriesPoints : series.Renderer.Points ?? null!; + List points = seriesPoints is not null ? seriesPoints : series.Renderer?.Points ?? null!; if (series.EmptyPointSettings.Mode != EmptyPointMode.Drop) { @@ -406,18 +409,18 @@ internal static List FilterEmptyPoints(ChartSeries series, [Optional] Lis points[i].Index = i; if (points[i].IsEmpty) { - if (series.Renderer.ChartPoints is { }) + if (series.Renderer?.ChartPoints is { }) { series.Renderer.ChartPoints[i].SymbolLocations = []; } points[i].SymbolLocations = []; - if (series.Renderer.ChartPoints is { }) + if (series.Renderer?.ChartPoints is { }) { series.Renderer.ChartPoints[i].Regions = []; } points[i].Regions = []; points.RemoveRange(i, 1); - series.Renderer.ChartPoints?.RemoveRange(i, 1); + series.Renderer?.ChartPoints?.RemoveRange(i, 1); i--; } } @@ -439,7 +442,7 @@ internal override void FindSplinePoint() DrawPoints = []; CreateDrawPoints(points, ref isNegativePoint); - if (!isNegativePoint && Series?.Renderer.YMin < 0) + if (!isNegativePoint && Series?.Renderer?.YMin < 0) { Series.Renderer.YMin = 0; } @@ -456,7 +459,7 @@ internal virtual string GetSplineDirection(ControlPoints data, Point firstPoint, ChartEventLocation bpt1 = ChartHelper.GetPoint(XAxisRenderer.GetPointValue(data.ControlPoint1.X), YAxisRenderer.GetPointValue(data.ControlPoint1.Y), XAxisRenderer, YAxisRenderer, XLength, YLength, isInverted); ChartEventLocation bpt2 = ChartHelper.GetPoint(XAxisRenderer.GetPointValue(data.ControlPoint2.X), YAxisRenderer.GetPointValue(data.ControlPoint2.Y), XAxisRenderer, YAxisRenderer, XLength, YLength, isInverted); - if (Series is not null && (Series.Renderer.YAxisRenderer is LogarithmicAxisRenderer) && Math.Abs(Series.Renderer.YMin - Math.Floor(Series.Renderer.YMin)) > double.Epsilon) + if (Series is not null && (Series.Renderer?.YAxisRenderer is LogarithmicAxisRenderer) && Math.Abs(Series.Renderer.YMin - Math.Floor(Series.Renderer.YMin)) > double.Epsilon) { bpt1.Y = Math.Abs(bpt1.Y) > YLength ? 1 : bpt1.Y; bpt2.Y = Math.Abs(bpt2.Y) > YLength ? 1 : bpt2.Y; diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/DatalabelRenderer/DataLabelRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/DatalabelRenderer/DataLabelRenderer.cs index 17e28db..ab820f6 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/DatalabelRenderer/DataLabelRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/DatalabelRenderer/DataLabelRenderer.cs @@ -548,7 +548,7 @@ private bool CheckRectLabelOverlap(Rect labelRect, List dataLabelCollectio baseOverlap = labelRect.Y < 0 || (!_isRotationEnabled && _labelAngle == 0 && ChartHelper.IsCollide(labelRect, dataLabelCollection, SeriesRenderer?.ClipRect ?? null!)) || labelRect.Y + labelRect.Height > SeriesRenderer?.ClipRect?.Height; if (Series.Marker.DataLabel.Template is null && !baseOverlap && position != ChartLabelPosition.Outer) { - baseOverlap = ((labelRect.Y / 2) + size.Height + point?.Regions[0].Height - (2 * extraSpace)) > series.Renderer.ClipRect?.Height; + baseOverlap = ((labelRect.Y / 2) + size.Height + point?.Regions[0].Height - (2 * extraSpace)) > series.Renderer?.ClipRect?.Height; } } else @@ -652,7 +652,7 @@ private void CreateDataLabelTemplate(ChartSeries series, ChartDataLabel dataLabe string left = Convert.ToString(posX, _culture) + "px"; string top = Convert.ToString(posY, _culture) + "px"; Color rgbValue = Color.FromName(_fontBackground ?? string.Empty); - string color = string.IsNullOrEmpty(dataLabel.Font.Color) ? dataLabel.Font.Color : (Math.Round(Convert.ToDouble(((rgbValue.R * 299) + (rgbValue.G * 587) + (rgbValue.B * 114)) / 1000, _culture), 1) >= 128 ? "black" : "white"); + string color = string.IsNullOrEmpty(dataLabel.Font?.Color) ? dataLabel.Font?.Color ?? "black" : (Math.Round(Convert.ToDouble(((rgbValue.R * 299) + (rgbValue.G * 587) + (rgbValue.B * 114)) / 1000, _culture), 1) >= 128 ? "black" : "white"); bool isAnimation = ((series.Animation.Enable && SyncfusionService?._options.Animation == GlobalAnimationMode.Default) || (SyncfusionService?._options.Animation == GlobalAnimationMode.Enable)) && Owner is not null && Owner._shouldAnimateSeries; string visibility = !(pointTemplateSize.Count > 0) ? "hidden" : isAnimation ? "hidden" : "visible"; string id; @@ -704,7 +704,7 @@ private void RenderDatalabels(RenderTreeBuilder builder, ChartMarker marker) string transform = string.Empty, clipPath = string.Empty; transform = "translate(" + SeriesRenderer?.ClipRect?.X.ToString(_culture) + "," + SeriesRenderer?.ClipRect?.Y.ToString(_culture) + ")"; - clipPath = "url(#" + Owner.ID + "_ChartSeriesClipRect_" + SeriesIndex() + ')'; + clipPath = "url(#" + Owner?.ID + "_ChartSeriesClipRect_" + SeriesIndex() + ')'; List stackLabelRects = Owner?._stackLabelRenderer?._rectOptions ?? []; @@ -778,7 +778,7 @@ private RenderingState InitializeRenderingState(ChartSeries series, ChartDataLab return new RenderingState { Inverted = Owner is not null && Owner._requireInvertedAxis, - YAxisInversed = series.Renderer.YAxisRenderer.Axis is not null && series.Renderer.YAxisRenderer.Axis.IsAxisInverse, + YAxisInversed = series.Renderer?.YAxisRenderer.Axis is not null && series.Renderer.YAxisRenderer.Axis.IsAxisInverse, TemplateId = Owner?.ID + "_Series_" + (SeriesRenderer?.Index != 0 ? SeriesRenderer?.Category().ToString() : SeriesRenderer.Index.ToString(CultureInfo.InvariantCulture)) + "_DataLabelCollections", LabelAngle = dataLabel.LabelIntersectAction == "Rotate90" ? 90 : dataLabel.Angle, IsRotationEnabled = dataLabel.LabelIntersectAction == "Rotate90" || dataLabel.EnableRotation @@ -802,7 +802,7 @@ private RenderingState InitializeRenderingState(ChartSeries series, ChartDataLab ? visiblePoints.FirstOrDefault(point => point.TemplateSize is not null && point.TemplateSize.Count > 0)?.TemplateSize ?? null! : []; - font = dataLabel.Font.GetFontOptions(Owner?._chartThemeStyle ?? null!); + font = dataLabel.Font?.GetFontOptions(Owner?._chartThemeStyle ?? null!) ?? null!; ApplyAdaptiveRotationIfNeeded(series, visiblePoints!, font, ref state); _isRotationEnabled = state.IsRotationEnabled; _labelAngle = state.LabelAngle; @@ -825,7 +825,7 @@ private void ApplyAdaptiveRotationIfNeeded(ChartSeries series, List visib { if (Owner is not null && Owner.EnableAdaptiveRendering && !(state.IsRotationEnabled && (state.LabelAngle == 90 || state.LabelAngle == -90)) - && !series.Renderer.IsPathSeries() + && series.Renderer is not null && !series.Renderer.IsPathSeries() && series.Type != ChartSeriesType.Bubble && series.SeriesType is not null && !series.SeriesType.Contains("Bar", StringComparison.InvariantCulture) @@ -874,10 +874,10 @@ private void ProcessSinglePoint(Point point, int pointIndex, ChartSeries series, { _margin = new ChartEventMargin { - Left = dataLabel.Margin.Left, - Right = dataLabel.Margin.Right, - Bottom = dataLabel.Margin.Bottom, - Top = dataLabel.Margin.Top + Left = dataLabel.Margin?.Left ?? 5, + Right = dataLabel.Margin?.Right ?? 5, + Bottom = dataLabel.Margin?.Bottom ?? 5, + Top = dataLabel.Margin?.Top ?? 5 }; if (!ShouldProcessPoint(point, series)) @@ -903,7 +903,7 @@ private static bool ShouldProcessPoint(Point point, ChartSeries series) { return point.SymbolLocations.Count != 0 && point.SymbolLocations[0] is not null - && series.Renderer.IsPointWithInRange(point); + && series.Renderer is not null && series.Renderer.IsPointWithInRange(point); } /// @@ -995,9 +995,9 @@ private TextRenderEventArgs CreateDataLabelRenderArgs(Point point, LabelLocation labelLocation, text, dataLabel.Fill, - new BorderModel() { Width = dataLabel.Border.Width, Color = dataLabel.Border.Color! }, + new BorderModel() { Width = dataLabel.Border?.Width ?? double.NaN, Color = dataLabel.Border?.Color ?? null! }, dataLabel.Template, - dataLabel.Font.GetChartDefaultFont(Owner?._chartThemeStyle ?? null!), + dataLabel.Font?.GetChartDefaultFont(Owner?._chartThemeStyle ?? null!) ?? null!, SeriesRenderer?.Index ?? 0); } @@ -1247,8 +1247,8 @@ private LabelPositionInfo CalculateLabelPosition(Rect rect, Size textSize, Label if (angle != 0 && state.IsRotationEnabled) { - xValue = xPos - ((_isShape ? dataLabel.Margin.Left : 5) / 2) + ((_isShape ? dataLabel.Margin.Right : 5) / 2); - yValue = yPos - ((_isShape ? dataLabel.Margin.Top : 5) / 2) - (textSize.Height / (_isShape ? dataLabel.Margin.Top : 5)) + ((_isShape ? dataLabel.Margin.Bottom : 5) / 2); + xValue = xPos - ((_isShape ? dataLabel.Margin?.Left ?? 5 : 5) / 2) + ((_isShape ? dataLabel.Margin?.Right ?? 5 : 5) / 2); + yValue = yPos - ((_isShape ? dataLabel.Margin?.Top ?? 5 : 5) / 2) - (textSize.Height / (_isShape ? dataLabel.Margin?.Top ?? 5 : 5)) + ((_isShape ? dataLabel.Margin?.Bottom ?? 5 : 5) / 2); degree = (angle > 360) ? angle - 360 : (angle < -360) ? angle + 360 : angle; } else @@ -1281,7 +1281,7 @@ private LabelPositionInfo CalculateLabelPosition(Rect rect, Size textSize, Label private void AdjustPositionForClipping(ref double xPos, ref double yPos, Size textSize, Rect clip, ChartSeries series) { xPos -= xPos + (textSize.Width / 2) > clip.Width - ? (!Owner._requireInvertedAxis && xPos > clip.Width) ? 0 : xPos + (textSize.Width / 2) - clip.Width + ? (Owner is not null && !Owner._requireInvertedAxis && xPos > clip.Width) ? 0 : xPos + (textSize.Width / 2) - clip.Width : 0; yPos -= (yPos + textSize.Height > clip.Y + clip.Height @@ -1365,7 +1365,7 @@ private void AddTextLabel(Point point, int labelIndex, LabelPositionInfo posInfo posInfo.XPos.ToString(_culture), posInfo.YPos.ToString(_culture), color, - dataLabel.Font.GetFontOptions(Owner?._chartThemeStyle ?? null!), + dataLabel.Font?.GetFontOptions(Owner?._chartThemeStyle ?? null!) ?? null!, argsData.Text, anchor, _commonId + point.Index + "_Text_" + labelIndex, @@ -1535,7 +1535,7 @@ public override void HandleChartSizeChange(Rect rect) _dataLabelActualRectOptions.Clear(); RendererShouldRender = Series.Marker.DataLabel.Visible; SeriesRenderer = Series.Renderer; - if (RendererShouldRender && SeriesRenderer.Series is not null && SeriesRenderer.Series.Visible && Owner is not null && Owner._shouldRenderDataLabel) + if (RendererShouldRender && SeriesRenderer?.Series is not null && SeriesRenderer.Series.Visible && Owner is not null && Owner._shouldRenderDataLabel) { CalculateRenderTreeBuilderOptions(Series, Series.Marker.DataLabel); } diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/LastDatalabelRenderer/LastDataLabelRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/LastDatalabelRenderer/LastDataLabelRenderer.cs index 8c2baea..6bc2de9 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/LastDatalabelRenderer/LastDataLabelRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/LastDatalabelRenderer/LastDataLabelRenderer.cs @@ -211,7 +211,7 @@ private void CreateConnectorPath(ChartSeries series, ChartLastDataLabel lastData string direction = $"M {lineStartX.ToString(Culture)} {lineStartY.ToString(Culture)} L {lineEndX.ToString(Culture)} {lineEndY.ToString(Culture)}"; string lineColor = !string.IsNullOrEmpty(lastDataLabel.LineColor) ? lastDataLabel.LineColor : Owner?._chartThemeStyle?.CrosshairLine ?? string.Empty; - PathOptions pathOption = new($"{ElementId}_LastDataLabelLine_{SeriesIndex()}", direction, lastDataLabel.DashArray, lastDataLabel.LineWidth, lineColor, 1, "none", "", "", series.Renderer.GetPointDescriptionFormatText(lastPoint), "", "", ""); + PathOptions pathOption = new($"{ElementId}_LastDataLabelLine_{SeriesIndex()}", direction, lastDataLabel.DashArray, lastDataLabel.LineWidth, lineColor, 1, "none", "", "", series.Renderer?.GetPointDescriptionFormatText(lastPoint) ?? null!, "", "", ""); _pathOptions.Add(pathOption); } @@ -294,7 +294,7 @@ internal void RenderLastValue(ChartSeries series, ChartLastDataLabel lastDataLab Point lastPoint = visiblePoints[^1]; FinancialPoint fPoint = lastPoint as FinancialPoint ?? null!; - ChartAxis yAxis = series.Renderer.YAxisRenderer.Axis ?? null!; + ChartAxis yAxis = series.Renderer?.YAxisRenderer.Axis ?? null!; double rawValue = isHighLowOpenClose ? Convert.ToDouble(fPoint.Close, Culture) : isHighLow ? Convert.ToDouble(fPoint.Low, Culture) : lastPoint.YValue; if (!(isHighLowOpenClose ? (lastPoint.Regions is not null && lastPoint.Regions.Count > 0) : (lastPoint.SymbolLocations is not null && lastPoint.SymbolLocations.Count > 0)) || rawValue > yAxis.Renderer?.VisibleRange.End || rawValue < yAxis.Renderer?.VisibleRange.Start) diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/MarkerRenders/ChartMarkerRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/MarkerRenders/ChartMarkerRenderer.cs index 36bc881..a70c234 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/MarkerRenders/ChartMarkerRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/MarkerRenders/ChartMarkerRenderer.cs @@ -187,7 +187,7 @@ private void AddSymbolForPoint(Point point, ChartEventLocation location, int ind { string symbolId = BuildSymbolId(point, index); - PathOptions shapeOption = new(symbolId, string.Empty, string.Empty, argsData.Border.Width, argsData.Border.Color, argsData.Series?.Marker?.Opacity ?? 1, (argsData.Series?.Marker != null && !string.IsNullOrEmpty(argsData.Series.Marker.Fill)) ? argsData.Series.Marker.Fill : argsData.Fill, "", "", series.Renderer.GetPointDescriptionFormatText(point), "", "", SeriesRenderer?.GetDataPoints(point.XValue, point.YValue) ?? null!); + PathOptions shapeOption = new(symbolId, string.Empty, string.Empty, argsData.Border.Width, argsData.Border.Color, argsData.Series?.Marker?.Opacity ?? 1, (argsData.Series?.Marker != null && !string.IsNullOrEmpty(argsData.Series.Marker.Fill)) ? argsData.Series.Marker.Fill : argsData.Fill, "", "", series.Renderer?.GetPointDescriptionFormatText(point) ?? null!, "", "", SeriesRenderer?.GetDataPoints(point.XValue, point.YValue) ?? null!); _symbolOptions.Add(CalculateSymbol(location, argsData.Shape.ToString(), new Size(argsData.Width, argsData.Height), marker.ImageUrl?.ToString() ?? string.Empty, shapeOption, Owner ?? null!)); point.Marker = new MarkerSettingModel() { Border = argsData.Border, Fill = argsData.Fill, Height = argsData.Height, Visible = true, Shape = argsData.Shape, Width = argsData.Width }; if (Series?.Renderer?.ChartPoints is { }) @@ -257,7 +257,7 @@ protected virtual void CalculateRenderTreeBuilderOptions() } if (Owner?._tooltip is not null && Series?.Marker != null && Series.Marker.Visible && Owner._shouldRenderMarker) { - Series.Renderer.GetChartData(point); + Series.Renderer?.GetChartData(point); } } } @@ -542,7 +542,7 @@ public override void HandleChartSizeChange(Rect rect) if (RendererShouldRender && !(Series.Type != ChartSeriesType.Scatter && Owner is not null && !Owner._shouldRenderMarker)) { CalculateRenderTreeBuilderOptions(); - SeriesRenderer.CalculateMarkerClipPath(); + SeriesRenderer?.CalculateMarkerClipPath(); } } #endregion diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/AreaSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/AreaSeriesRenderer.cs index 6003385..b093aea 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/AreaSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/AreaSeriesRenderer.cs @@ -52,7 +52,7 @@ private void CalculateDirection() } } - if (Series?.Renderer.Points?.Count > 1 && Direction.Length != 0) + if (Series?.Renderer?.Points?.Count > 1 && Direction.Length != 0) { GetAreaPathDirection(Series.Renderer.Points[^1].XValue, _origin, Series, Owner?._requireInvertedAxis ?? false, null!, "L"); } @@ -111,14 +111,14 @@ protected override void RenderSeries() Stroke = Series?.Border.Color ?? string.Empty, Opacity = Series?.Opacity ?? 1, StrokeDashArray = Series?.DashArray ?? string.Empty, - Direction = Series?.Renderer.Points?.Count > 1 && Direction.Length != 0 ? Direction.ToString() : string.Empty, + Direction = Series?.Renderer?.Points?.Count > 1 && Direction.Length != 0 ? Direction.ToString() : string.Empty, DataPoint = _datapoints ?? string.Empty, }; bool isAnimationDefault = Series is not null && Series.Animation.Enable && SyncfusionService?._options.Animation == GlobalAnimationMode.Default; if (Owner is not null && Owner._shouldAnimateSeries && (isAnimationDefault || (SyncfusionService?._options.Animation == GlobalAnimationMode.Enable))) { - AnimationOptions = new AnimationOptions(Series?.Renderer.ClipRectId() ?? null!, AnimationType.Linear); + AnimationOptions = new AnimationOptions(Series?.Renderer?.ClipRectId() ?? null!, AnimationType.Linear); } } diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/BubbleSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/BubbleSeriesRenderer.cs index 3426971..0ea7468 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/BubbleSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/BubbleSeriesRenderer.cs @@ -29,7 +29,7 @@ private void CalculateDirection() (double minRadius, double radius, double maximumSize) = CalculateRadiusAndSize(); - List points = Series?.Renderer.Points ?? null!; + List points = Series?.Renderer?.Points ?? null!; foreach (BubblePoint bubblePoint in points.Cast()) { ProcessBubblePoint(bubblePoint, minRadius, radius, maximumSize); @@ -55,7 +55,7 @@ private void CalculateDirection() { if (series.Type == ChartSeriesType.Bubble && series.Visible && (double.IsNaN(series.MaxRadius) || double.IsNaN(series.MinRadius))) { - maximumSize = series.Renderer.MaxSize > maximumSize ? series.Renderer.MaxSize : maximumSize; + maximumSize = series.Renderer?.MaxSize > maximumSize ? series.Renderer.MaxSize : maximumSize; } } @@ -64,7 +64,7 @@ private void CalculateDirection() } else { - maximumSize = Series?.Renderer.MaxSize ?? 0; + maximumSize = Series?.Renderer?.MaxSize ?? 0; radius = maxRadius - minRadius; } return (minRadius, radius, maximumSize); @@ -88,7 +88,7 @@ private void ProcessBubblePoint(BubblePoint bubblePoint, double minRadius, doubl ChartPoints[bubblePoint.Index].Regions = []; } - bool isPointInRange = ChartHelper.WithInRange(bubblePoint.Index - 1 > -1 ? Series?.Renderer.Points?[bubblePoint.Index - 1] ?? null! : null!, bubblePoint, bubblePoint.Index + 1 < Series?.Renderer.Points?.Count ? Series.Renderer.Points[bubblePoint.Index + 1] : null!, XAxisRenderer); + bool isPointInRange = ChartHelper.WithInRange(bubblePoint.Index - 1 > -1 ? Series?.Renderer?.Points?[bubblePoint.Index - 1] ?? null! : null!, bubblePoint, bubblePoint.Index + 1 < Series?.Renderer?.Points?.Count ? Series.Renderer.Points[bubblePoint.Index + 1] : null!, XAxisRenderer); if (bubblePoint.Visible && isPointInRange) { @@ -186,7 +186,7 @@ private void RenderBubbleSymbol(BubblePoint bubblePoint, double segmentRadius, P PathOptions shapeOption = new() { - Id = Owner?.ID + "_Series_" + Series?.Renderer.Index + "_Point_" + bubblePoint.Index, + Id = Owner?.ID + "_Series_" + Series?.Renderer?.Index + "_Point_" + bubblePoint.Index, Fill = argsData.Fill, StrokeWidth = argsData.Border.Width, Stroke = argsData.Border.Color, @@ -676,7 +676,7 @@ internal override void UpdateDirection() /// The point to serialize and append. internal override void GetChartData(Point point) { - _ = ChartData?.Append(JsonSerializer.Serialize(Series?.Renderer.ChartPoints?[point.Index] as IBubblePoint, _jsonOptions)); + _ = ChartData?.Append(JsonSerializer.Serialize(Series?.Renderer?.ChartPoints?[point.Index] as IBubblePoint, _jsonOptions)); _ = ChartData?.Append(','); } diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/MultiColoredAreaSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/MultiColoredAreaSeriesRenderer.cs index 24d723d..68d3a2b 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/MultiColoredAreaSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/MultiColoredAreaSeriesRenderer.cs @@ -148,7 +148,7 @@ private void RenderNewSegment(ChartEventLocation firstPoint, Point previous, Cha /// private void GeneratePathOption(List _options, ChartSeries series, Point point, string direction, string id) { - _options.Add(new PathOptions(Owner?.ID + "_Series_" + series.Renderer.Index + id, direction, series.DashArray, series.Border.Width, series.Border.Color, series.Opacity, SetPointColor(point, Interior ?? null!), "", "", "", "", "", GetDataPoints(point.XValue, point.YValue))); + _options.Add(new PathOptions(Owner?.ID + "_Series_" + series.Renderer?.Index + id, direction, series.DashArray, series.Border.Width, series.Border.Color, series.Opacity, SetPointColor(point, Interior ?? null!), "", "", "", "", "", GetDataPoints(point.XValue, point.YValue))); } #endregion diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/MultiColoredLineSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/MultiColoredLineSeriesRenderer.cs index 3594db8..54bd69b 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/MultiColoredLineSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/MultiColoredLineSeriesRenderer.cs @@ -96,7 +96,7 @@ private string HandleVisiblePoint(Point point, Point previous, bool isInverted, if (SetPointColor(point, previous, Series ?? null!, Series?.SegmentAxis == Segment.X, _segments)) { _options.Add(new PathOptions( - Owner?.ID + "_Series_" + Series?.Renderer.Index + "_Point_" + previous.Index, + Owner?.ID + "_Series_" + Series?.Renderer?.Index + "_Point_" + previous.Index, Direction.ToString(), Series?.DashArray ?? string.Empty, Series?.Width ?? 0, @@ -157,7 +157,7 @@ private void AddResidualPath(List visiblePoints) } _options.Add(new PathOptions( - Owner?.ID + "_Series_" + Series?.Renderer.Index, + Owner?.ID + "_Series_" + Series?.Renderer?.Index, Direction.ToString(), Series?.DashArray ?? string.Empty, Series?.Width ?? 0, diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/SplineAreaSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/SplineAreaSeriesRenderer.cs index 3ae9036..2733dab 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/SplineAreaSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/SplineAreaSeriesRenderer.cs @@ -24,7 +24,7 @@ internal class SplineAreaSeriesRenderer : SplineBaseSeriesRenderer private void CalculateDirection() { bool isInverted = Owner is not null && Owner._requireInvertedAxis; - List points = Series?.Renderer.Points ?? null!; + List points = Series?.Renderer?.Points ?? null!; Direction = new System.Text.StringBuilder(); ChartData = new System.Text.StringBuilder(); double origin = Math.Max(YAxisRenderer?.VisibleRange.Start ?? 0, 0); @@ -147,7 +147,7 @@ protected override void RenderSeries() Stroke = Series?.Border.Color ?? string.Empty, Opacity = Series?.Opacity ?? 1, StrokeDashArray = Series?.DashArray ?? string.Empty, - Direction = Series?.Renderer.Points?.Count > 1 && Direction.Length != 0 ? Direction.ToString() : string.Empty, + Direction = Series?.Renderer?.Points?.Count > 1 && Direction.Length != 0 ? Direction.ToString() : string.Empty, DataPoint = _dataPoints ?? string.Empty }; diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/SplineSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/SplineSeriesRenderer.cs index 9a5efd0..875d566 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/SplineSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/SplineSeriesRenderer.cs @@ -18,7 +18,7 @@ internal class SplineSeriesRenderer : SplineBaseSeriesRenderer private void CalculateDirection() { bool isInverted = Owner is not null && Owner._requireInvertedAxis; - List points = Series?.Renderer.Points ?? null!; + List points = Series?.Renderer?.Points ?? null!; string startPoint = "M"; Direction = new System.Text.StringBuilder(); ChartData = new System.Text.StringBuilder(); diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingAreaSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingAreaSeriesRenderer.cs index a56445b..3e63ace 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingAreaSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingAreaSeriesRenderer.cs @@ -130,11 +130,11 @@ private void AppendClosingDirection(List visiblePoints, int pointsLength, for (int j = pointsLength - 1; j >= startPoint; j--) { ChartSeries previousSeries = GetPreviousSeries(Series!); - if (previousSeries.EmptyPointSettings.Mode != EmptyPointMode.Drop || (previousSeries.Renderer.Points != null && !previousSeries.Renderer.Points[j].IsEmpty)) + if (previousSeries.EmptyPointSettings.Mode != EmptyPointMode.Drop || (previousSeries.Renderer?.Points != null && !previousSeries.Renderer.Points[j].IsEmpty)) { double startValue = GetStackingStartValue(visiblePoints[j].Index, GetVisibleSeriesIndex()); - ChartEventLocation point2 = ChartHelper.GetPoint(XAxisRenderer.GetPointValue(visiblePoints[j].XValue), YAxisRenderer.GetPointValue((!Series.Visible && Series._isLegendClicked) ? startValue : stackedvalue.StartValues[j]), XAxisRenderer, YAxisRenderer, XLength, YLength, Owner is not null && Owner._requireInvertedAxis); - double borderWidth = Series.Renderer.Index == 0 ? 0 : Series.Border.Width / 2; + ChartEventLocation point2 = ChartHelper.GetPoint(XAxisRenderer.GetPointValue(visiblePoints[j].XValue), YAxisRenderer.GetPointValue((Series != null && !Series.Visible && Series._isLegendClicked) ? startValue : stackedvalue.StartValues[j]), XAxisRenderer, YAxisRenderer, XLength, YLength, Owner is not null && Owner._requireInvertedAxis); + double borderWidth = Series?.Renderer?.Index == 0 ? 0 : (Series?.Border.Width ?? 1) / 2; _ = Direction.Append("L" + SPACE + point2.X.ToString(Culture) + SPACE + (point2.Y - borderWidth).ToString(Culture) + SPACE); } } @@ -150,7 +150,7 @@ private ChartSeries GetPreviousSeries(ChartSeries series) List seriesCollection = Owner?._seriesContainer?.Elements.Cast().ToList() ?? null!; for (int i = 0, length = seriesCollection.Count; i < length; i++) { - if (seriesCollection[i].Renderer is not null && series.Renderer is not null && series.Renderer.Index == seriesCollection[i].Renderer.Index && i != 0) + if (seriesCollection[i].Renderer is not null && series.Renderer is not null && series.Renderer.Index == seriesCollection[i].Renderer?.Index && i != 0) { return seriesCollection[i - 1]; } @@ -278,7 +278,7 @@ internal void CalculateDirection() List visiblePoints = EnableComplexProperty(); Direction = new System.Text.StringBuilder(); ChartData = new System.Text.StringBuilder(); - if ((Series is not null && !Series.Visible && !Series._isLegendClicked) || Series?.Renderer.StackedValues is null || Series.Renderer.StackedValues.StartValues.Count == 0) + if ((Series is not null && !Series.Visible && !Series._isLegendClicked) || Series?.Renderer?.StackedValues is null || Series.Renderer.StackedValues.StartValues.Count == 0) { return; } diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingBarSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingBarSeriesRenderer.cs index dbd829d..0af921a 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingBarSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingBarSeriesRenderer.cs @@ -123,7 +123,7 @@ internal void CalculateColumnPathOption() Point previousPoint = pointColumn.Index - 1 > -1 ? Points?[pointColumn.Index - 1] ?? null! : null!; Point nextPoint = pointColumn.Index + 1 < Points?.Count ? Points[pointColumn.Index + 1] : null!; - if (pointColumn.Visible && ChartHelper.WithInRange(previousPoint, pointColumn, nextPoint, Series?.Renderer.XAxisRenderer ?? null!) && Series?.Renderer.StackedValues is not null) + if (pointColumn.Visible && ChartHelper.WithInRange(previousPoint, pointColumn, nextPoint, Series?.Renderer?.XAxisRenderer ?? null!) && Series?.Renderer?.StackedValues is not null) { double startValue = GetStackingStartValue(pointColumn.Index, GetVisibleSeriesIndex()); Rect rect = GetRectangle(pointColumn.XValue + sideBySideInfo.Start, (!Series.Visible && Series._isLegendClicked) ? startValue : Series.Renderer.StackedValues.EndValues[pointColumn.Index], pointColumn.XValue + sideBySideInfo.End, (!Series.Visible && Series._isLegendClicked) ? startValue : Series.Renderer.StackedValues.StartValues[pointColumn.Index]); diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingColumnSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingColumnSeriesRenderer.cs index 89256fc..0ea6b48 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingColumnSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingColumnSeriesRenderer.cs @@ -120,7 +120,7 @@ internal void CalculateColumnPathOption() Point previousPoint = pointColumn.Index - 1 > -1 ? Points?[pointColumn.Index - 1] ?? null! : null!; Point nextPoint = pointColumn.Index + 1 < Points?.Count ? Points[pointColumn.Index + 1] : null!; - if (pointColumn.Visible && ChartHelper.WithInRange(previousPoint, pointColumn, nextPoint ?? null!, Series?.Renderer.XAxisRenderer ?? null!) && Series?.Renderer.StackedValues is not null) + if (pointColumn.Visible && ChartHelper.WithInRange(previousPoint, pointColumn, nextPoint ?? null!, Series?.Renderer?.XAxisRenderer ?? null!) && Series?.Renderer?.StackedValues is not null) { double startValue = GetStackingStartValue(pointColumn.Index, GetVisibleSeriesIndex()); Rect rect = GetRectangle(pointColumn.XValue + sideBySideInfo.Start, (!Series.Visible && Series._isLegendClicked) ? startValue : Series.Renderer.StackedValues.EndValues[pointColumn.Index], pointColumn.XValue + sideBySideInfo.End, (!Series.Visible && Series._isLegendClicked) ? startValue : Series.Renderer.StackedValues.StartValues[pointColumn.Index]); diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingLineSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingLineSeriesRenderer.cs index 5ef6116..332d161 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingLineSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StackingLineSeriesRenderer.cs @@ -120,7 +120,7 @@ internal void CalculateDirection() return; } - StackValues stackedValue = Series?.Renderer.StackedValues ?? null!; + StackValues stackedValue = Series?.Renderer?.StackedValues ?? null!; int segmentIndex = 0; for (int i = 0; i < visiblePoints.Count; i++) { diff --git a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StepLineSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StepLineSeriesRenderer.cs index 2649ca1..035c713 100644 --- a/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StepLineSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/SeriesRenderers/SeriesTypeRenderers/StepLineSeriesRenderer.cs @@ -22,7 +22,7 @@ private void CalculateDirection() string startPoint = "M"; Point prevPoint = null!; double lineLength = GetLineLength(); - List visiblePoints = Series?.Renderer.Points ?? null!; + List visiblePoints = Series?.Renderer?.Points ?? null!; Direction = new System.Text.StringBuilder(); ChartData = new System.Text.StringBuilder(); diff --git a/src/Components/Charts/Chart/Renderer/StriplineRenderer/ChartStriplineRenderer.cs b/src/Components/Charts/Chart/Renderer/StriplineRenderer/ChartStriplineRenderer.cs index 4a1a57c..5e5b973 100644 --- a/src/Components/Charts/Chart/Renderer/StriplineRenderer/ChartStriplineRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/StriplineRenderer/ChartStriplineRenderer.cs @@ -281,10 +281,10 @@ private void CreatePixelStriplinePath(bool isUpdateDirection, string id) { Id = id, Direction = direction, - StrokeDashArray = Stripline.DashArray ?? null!, - StrokeWidth = Stripline.Size != 0 ? Stripline.Size : 1, - Stroke = Stripline.Color, - Opacity = Stripline.Opacity + StrokeDashArray = Stripline?.DashArray ?? null!, + StrokeWidth = Stripline?.Size != 0 ? Stripline?.Size ?? 0 : 1, + Stroke = Stripline?.Color ?? "#808080", + Opacity = Stripline?.Opacity ?? 1 }; } else if (_striplinePath is { }) diff --git a/src/Components/Charts/Chart/Renderer/TrendlineRenderer/TrendlineBase.cs b/src/Components/Charts/Chart/Renderer/TrendlineRenderer/TrendlineBase.cs index 5affe91..5bb79b4 100644 --- a/src/Components/Charts/Chart/Renderer/TrendlineRenderer/TrendlineBase.cs +++ b/src/Components/Charts/Chart/Renderer/TrendlineRenderer/TrendlineBase.cs @@ -310,7 +310,7 @@ private void SetLinearRange() xValues.Add(_points[index].XValue); yValues.Add(_points[index].YValue); } - if (_trendLineSeries is { }) + if (_trendLineSeries is { } && _trendLineSeries.Renderer is not null) { _trendLineSeries.Renderer.Points = GetLinearPoints(xValues, FindSlopeIntercept(xValues, yValues)); } @@ -347,7 +347,7 @@ private void SetExponentialRange() x_Value.Add(_points[index].XValue); y_Value.Add(_points[index].YValue != 0 ? Math.Log(_points[index].YValue) : 0); } - if (_trendLineSeries is { }) + if (_trendLineSeries is { } && _trendLineSeries.Renderer is not null) { _trendLineSeries.Renderer.Points = GetExponentialPoints(x_Value, FindSlopeIntercept(x_Value, y_Value)); } @@ -390,7 +390,7 @@ private void SetMovingAverageRange() yValues.Add(_points[index].YValue); } - if (_trendLineSeries is { }) + if (_trendLineSeries is { } && _trendLineSeries.Renderer is not null) { _trendLineSeries.Renderer.Points = GetMovingAveragePoints(xAvgValues, yValues); } @@ -447,7 +447,7 @@ private void SetPolynomialRange() yPolyValues.Add(_points[index].YValue); } - if (_trendLineSeries is { }) + if (_trendLineSeries is { } && _trendLineSeries.Renderer is not null) { _trendLineSeries.Renderer.Points = GetPolynomialPoints(xPolyValues, yPolyValues); } @@ -474,7 +474,7 @@ private Point GetDataPoint(double x, double y, int index) Visible = true }; - if (_trendLineSeries is not null) + if (_trendLineSeries is not null && _trendLineSeries.Renderer is not null) { _trendLineSeries.Renderer.XMin = Math.Min(_trendLineSeries.Renderer.XMin, trendPoint.XValue); _trendLineSeries.Renderer.YMin = Math.Min(_trendLineSeries.Renderer.YMin, trendPoint.YValue); @@ -739,7 +739,7 @@ private List GetPoints(List xValues) } else { - double forecast = _trendLineSeries?.Renderer.XAxisRenderer is DateTimeAxisRenderer ? 0 : Trendline?.ForwardForecast ?? 0; + double forecast = _trendLineSeries?.Renderer?.XAxisRenderer is DateTimeAxisRenderer ? 0 : Trendline?.ForwardForecast ?? 0; xInterpolated += ((_points?.Count ?? 0) + forecast) / _polynomialSlopes.Length; xValue = xValues[Convert.ToInt32(Math.Round(xInterpolated)) - 1]; yValue = GetPolynomialYValue(_polynomialSlopes, xValue); @@ -766,7 +766,7 @@ private void SetPowerRange() xValues.Add(_points[index].XValue != 0 && !double.IsNaN(_points[index].XValue) ? Math.Log(_points[index].XValue) : 0); yValues.Add(_points[index].YValue != 0 && !double.IsNaN(_points[index].YValue) ? Math.Log(_points[index].YValue) : 0); } - if (_trendLineSeries is { }) + if (_trendLineSeries is { } && _trendLineSeries.Renderer is not null) { _trendLineSeries.Renderer.Points = GetPowerPoints(powerPoints, FindSlopeIntercept(xValues, yValues)); } @@ -811,7 +811,7 @@ private void SetLogarithmicRange() y_LogValue.Add(_points[index].YValue); } - if (_trendLineSeries is { }) + if (_trendLineSeries is { } && _trendLineSeries.Renderer is not null) { _trendLineSeries.Renderer.Points = GetLogarithmicPoints(x_PointsLgr, FindSlopeIntercept(x_LogValue, y_LogValue)); } @@ -897,8 +897,8 @@ internal void UpdateTrendlineAnimation() /// internal void InitDataSource() { - _trendLineSeries?.Renderer.InitSeriesRendererFields(); - _points = _series?.Renderer.Points; + _trendLineSeries?.Renderer?.InitSeriesRendererFields(); + _points = _series?.Renderer?.Points; if (_points is not null && _points.Count > 0) { @@ -929,7 +929,7 @@ internal void InitDataSource() if (Trendline?.Type is not TrendlineTypes.Linear and not TrendlineTypes.MovingAverage) { - _trendLineSeries?.Renderer.FindSplinePoint(); + _trendLineSeries?.Renderer?.FindSplinePoint(); } } @@ -938,8 +938,8 @@ internal void InitDataSource() /// internal void InitiateAxis() { - ChartAxisRenderer x_AxisRender = _series?.Renderer.XAxisRenderer ?? null!; - ChartAxisRenderer y_AxisRender = _series?.Renderer.YAxisRenderer ?? null!; + ChartAxisRenderer x_AxisRender = _series?.Renderer?.XAxisRenderer ?? null!; + ChartAxisRenderer y_AxisRender = _series?.Renderer?.YAxisRenderer ?? null!; ChartSeriesRenderer trendlineSeriesRenderer = _trendLineSeries?.Renderer ?? null!; trendlineSeriesRenderer.XAxisRenderer = x_AxisRender; diff --git a/src/Components/Charts/Chart/Renderer/TrendlineRenderer/TrendlineSeriesRenderer/Trendline_SplineSeriesRenderer.cs b/src/Components/Charts/Chart/Renderer/TrendlineRenderer/TrendlineSeriesRenderer/Trendline_SplineSeriesRenderer.cs index e8d4ee6..b5779ff 100644 --- a/src/Components/Charts/Chart/Renderer/TrendlineRenderer/TrendlineSeriesRenderer/Trendline_SplineSeriesRenderer.cs +++ b/src/Components/Charts/Chart/Renderer/TrendlineRenderer/TrendlineSeriesRenderer/Trendline_SplineSeriesRenderer.cs @@ -58,7 +58,7 @@ private void CalculateDirection() { Direction = new System.Text.StringBuilder(); ChartData = new System.Text.StringBuilder(); - List points = Series?.Renderer.Points ?? null!; + List points = Series?.Renderer?.Points ?? null!; bool isInverted = Owner is not null && Owner._requireInvertedAxis; string startPoint = "M"; Point firstPoint = null!; diff --git a/src/Components/Charts/Chart/Renderer/UserInteractions/DataEditing.cs b/src/Components/Charts/Chart/Renderer/UserInteractions/DataEditing.cs index 0b3304b..9decda6 100644 --- a/src/Components/Charts/Chart/Renderer/UserInteractions/DataEditing.cs +++ b/src/Components/Charts/Chart/Renderer/UserInteractions/DataEditing.cs @@ -47,7 +47,7 @@ internal DataEditing(SfChart sfChart) /// A cursor style string (e.g., "ns-resize", "ew-resize", "null"). private string UpdateCursorStyle(PointData pointData, ChartData data) { - if (pointData.Series is not null && pointData.Series.ChartDataEditSettings?.Enable == true && pointData.Point is not null && (data.InsideRegion || !pointData.Series.Renderer.IsRectSeries())) + if (pointData.Series is not null && pointData.Series.ChartDataEditSettings?.Enable == true && pointData.Point is not null && (data.InsideRegion || (pointData.Series.Renderer != null && !pointData.Series.Renderer.IsRectSeries()))) { return GetCursorStyle(pointData); } @@ -248,9 +248,9 @@ internal void PointMouseDown() string cursor = UpdateCursorStyle(pointData, data); _chart.SetSvgCursor(cursor); - if (pointData.Point is not null && (data.InsideRegion || (pointData.Series is not null && !pointData.Series.Renderer.IsRectSeries()))) + if (pointData.Point is not null && (data.InsideRegion || (pointData.Series is not null && pointData.Series.Renderer is not null && !pointData.Series.Renderer.IsRectSeries()))) { - _seriesIndex = pointData.Series?.Renderer.Index; + _seriesIndex = pointData.Series?.Renderer?.Index; _pointIndex = pointData.Point.Index; ChartSeriesRenderer seriesRenderer = (ChartSeriesRenderer)(_chart._seriesContainer?.Renderers[_seriesIndex ?? 0] ?? null!); diff --git a/src/Components/Charts/Chart/Series/ChartSeries.cs b/src/Components/Charts/Chart/Series/ChartSeries.cs index f989c31..3fca4fc 100644 --- a/src/Components/Charts/Chart/Series/ChartSeries.cs +++ b/src/Components/Charts/Chart/Series/ChartSeries.cs @@ -1937,7 +1937,7 @@ protected override async Task OnParametersSetAsync() if (UpdateDataSource && NeedRendererUpdate) { NeedRendererUpdate = UpdateDataSource = false; - await (Container?.ProcessOnLayoutChangeAsync()).ConfigureAwait(false); + await (Container?.ProcessOnLayoutChangeAsync() ?? null!).ConfigureAwait(false); } else if (UpdateDataSource && !NeedRendererRemove && Container is not null && !Container._isOnceRendered) @@ -1949,7 +1949,7 @@ protected override async Task OnParametersSetAsync() { _needLayoutUpdate = false; await Task.Delay(10).ConfigureAwait(false); - await (Renderer?.Container?.Owner?.DelayLayoutChangeAsync()).ConfigureAwait(false); + await (Renderer?.Container?.Owner?.DelayLayoutChangeAsync() ?? null!).ConfigureAwait(false); } else if (_refreshRange && Renderer?.XAxisRenderer is not null && Renderer.YAxisRenderer is not null) @@ -2191,13 +2191,14 @@ private async Task RefreshSeriesAsync() if (IsUpdateDataSource()) { Container?._svgRenderer?.RefreshElementList(); - - Renderer.IsSeriesRender = false; + if (Renderer != null) + Renderer.IsSeriesRender = false; _ = SetDataManager((DataSource is not null) ? DataSource : Container?.DataSource ?? null!); - Container?._seriesContainer?.AddToRenderQueue(Renderer); + Container?._seriesContainer?.AddToRenderQueue(Renderer ?? null!); UpdateDataSource = true; - await Renderer.UpdateSeriesDataAsync().ConfigureAwait(false); + if (Renderer != null) + await Renderer.UpdateSeriesDataAsync().ConfigureAwait(false); if (!IsDisposed && Container is not null && Container._seriesContainer is not null && (Container._seriesContainer._previousRequestTime == DateTime.MinValue || (DateTime.Now - Container._seriesContainer._previousRequestTime).TotalMilliseconds > UPDATE_THRESHOLD)) @@ -2264,7 +2265,7 @@ private void ResetContainerRefreshFlags() /// private void HandleLegendRangeChange() { - if (Renderer.IsCategoryAxis() && + if (Renderer != null && Renderer.IsCategoryAxis() && ((_labelPreviousCount > 0 && _labelCurrentCount == 0) || (_labelPreviousCount == 0 && _labelCurrentCount > 0))) { _refreshRange = false; @@ -2273,8 +2274,8 @@ private void HandleLegendRangeChange() return; } - Renderer.XAxisRenderer.ChangeAxisRange(_refreshRange); - Renderer.YAxisRenderer.ChangeAxisRange(_refreshRange); + Renderer?.XAxisRenderer.ChangeAxisRange(_refreshRange); + Renderer?.YAxisRenderer.ChangeAxisRange(_refreshRange); _refreshRange = false; Container?.UpdateRenderers(); @@ -2336,7 +2337,7 @@ internal void DataCollectionChanged(object? source, NotifyCollectionChangedEvent { if (Container != null) { - Container._isLiveChart = Renderer.Series is null || !Renderer.Series._isSeriesChanged; + Container._isLiveChart = Renderer?.Series is null || !Renderer.Series._isSeriesChanged; } _ = RefreshSeriesAsync(); diff --git a/src/Components/Charts/Chart/SfChart.razor.JsInterop.cs b/src/Components/Charts/Chart/SfChart.razor.JsInterop.cs index 1af0696..bfc0186 100644 --- a/src/Components/Charts/Chart/SfChart.razor.JsInterop.cs +++ b/src/Components/Charts/Chart/SfChart.razor.JsInterop.cs @@ -147,7 +147,7 @@ public async Task ChartPanAsync(List axisNames, List zoomFactors for (int i = 0; i < axisCount; i++) { - string currentAxisName = axisNames[i].Replace("_", "", StringComparison.OrdinalIgnoreCase); + string currentAxisName = axisNames != null ? axisNames[i].Replace("_", "", StringComparison.OrdinalIgnoreCase) : string.Empty; ChartAxisRenderer? axisRenderer = _axisContainer?.Renderers.FirstOrDefault(r => string.Equals((r as ChartAxisRenderer)?.Axis?.Name.Replace("_", "", StringComparison.OrdinalIgnoreCase), currentAxisName, StringComparison.OrdinalIgnoreCase)) as ChartAxisRenderer; @@ -429,7 +429,7 @@ private void TriggerPointEvent(string eventName, EventCallback a PointData pointData = new ChartData(this).GetData(); if (pointData.Series is not null && pointData.Point is not null) { - PointEventArgs pointEvent = new(eventName, false, evt.ClientX, evt.ClientY, pointData.Point, pointData.Point.Index, pointData.Series, pointData.Series.Renderer.Index, evt.MouseX, evt.MouseY, isRightClick); + PointEventArgs pointEvent = new(eventName, false, evt.ClientX, evt.ClientY, pointData.Point, pointData.Point.Index, pointData.Series, pointData.Series.Renderer?.Index ?? 0, evt.MouseX, evt.MouseY, isRightClick); _ = InvokeDelegateAsync(action, pointEvent); } } @@ -818,7 +818,7 @@ public async Task TooltipEventTriggeredAsync(ITooltipRenderEventArgs args) .Where(seriesRenderer => seriesRenderer is not null && seriesRenderer.Index == args.Data.SeriesIndex) .Select(seriesRenderer => seriesRenderer.Series) .FirstOrDefault() ?? null!; - int pointsCount = series.Renderer.Points?.Count ?? 0; + int pointsCount = series.Renderer?.Points?.Count ?? 0; if (series is null || series.Renderer is null || pointsCount == 0 || args.Data.PointIndex < 0 || (pointsCount > 0 && args.Data.PointIndex > pointsCount)) { return; @@ -948,11 +948,11 @@ public void ZoomingComplete(ZoomingEventArgs zoomingEventArgs, IZoomingStates zo if ((_onZoomStartArgs is not null && !_onZoomStartArgs.Cancel) || (_onZoomingArgs is not null && !_onZoomingArgs.Cancel)) { - UpdateAxisZoomValues(zoomingEventArgs.AxisCollection, zoomingStates?.IsChartPanning ?? false); + UpdateAxisZoomValues(zoomingEventArgs?.AxisCollection ?? null!, zoomingStates?.IsChartPanning ?? false); } else if (_onZoomingArgs is null && _onZoomStartArgs is null) { - UpdateAxisZoomValues(zoomingEventArgs.AxisCollection, zoomingStates?.IsChartPanning ?? false); + UpdateAxisZoomValues(zoomingEventArgs?.AxisCollection ?? null!, zoomingStates?.IsChartPanning ?? false); } OnLayoutChange(_zoomingModule?.IsWheelZoom ?? false); if (_zoomingModule is not null) @@ -1050,9 +1050,9 @@ public void TriggerScrollEvents(IScrollEventsArgs scrollEventsArgs) currentRange.SetMinMax(scrollEventsArgs.CurrentRangeMin, scrollEventsArgs.CurrentRangeMax); } } - if (axis.Renderer is not null && OnScrollChanged is not null) + if (axis.Renderer is { } renderer && OnScrollChanged is not null) { - DataVizCommonHelper.InvokeEvent(OnScrollChanged, GetScrollArguments(scrollEventsArgs.Name, axis, axis.Renderer.VisibleRange, scrollEventsArgs.ZoomPosition, scrollEventsArgs.ZoomFactor, currentRange, axis.Renderer.VisibleInterval)); + DataVizCommonHelper.InvokeEvent(OnScrollChanged, GetScrollArguments(scrollEventsArgs?.Name ?? string.Empty, axis, renderer.VisibleRange, scrollEventsArgs?.ZoomPosition ?? 0, scrollEventsArgs?.ZoomFactor ?? 0, currentRange, renderer.VisibleInterval)); } } } @@ -1142,7 +1142,7 @@ public static ChartAxisScrollbarSettingsRange GetStartEnd(object start, object e [EditorBrowsable(EditorBrowsableState.Never)] public static ScrollEventArgs GetScrollArguments(string eventName, ChartAxis axis, DoubleRange range = new DoubleRange(), double zoomPosition = double.NaN, double zoomFactor = double.NaN, ChartAxisScrollbarSettingsRange currentRange = null!, double previousInterval = double.NaN) { - currentRange = currentRange is not null ? currentRange : GetStartEnd(axis?.Renderer?.VisibleRange.Start ?? 0, axis.Renderer?.VisibleRange.End ?? 0, axis.ValueType); + currentRange = currentRange is not null ? currentRange : GetStartEnd(axis?.Renderer?.VisibleRange.Start ?? 0, axis?.Renderer?.VisibleRange.End ?? 0, axis?.ValueType ?? ValueType.Double); VisibleRangeModel rangeModel = new(); if (axis?.Renderer is not null) { @@ -1150,7 +1150,7 @@ public static ChartAxisScrollbarSettingsRange GetStartEnd(object start, object e } VisibleRangeModel previousRange = ChartHelper.GetVisibleRangeModel(range, previousInterval); - return new ScrollEventArgs(eventName, axis ?? new(), currentRange, previousRange, zoomFactor, zoomPosition, rangeModel, axis.ZoomFactor, axis.ZoomPosition); + return new ScrollEventArgs(eventName, axis ?? new(), currentRange, previousRange, zoomFactor, zoomPosition, rangeModel, axis?.ZoomFactor ?? 1, axis?.ZoomPosition ?? 0); } #endregion } diff --git a/src/Components/Charts/Chart/UserInteractions/Tooltip/ChartData.cs b/src/Components/Charts/Chart/UserInteractions/Tooltip/ChartData.cs index d6f0581..91ccf54 100644 --- a/src/Components/Charts/Chart/UserInteractions/Tooltip/ChartData.cs +++ b/src/Components/Charts/Chart/UserInteractions/Tooltip/ChartData.cs @@ -176,7 +176,7 @@ private bool CheckRegionContainsPoint(List regionRect, Rect rect, double x private bool RectRegion(double x, double y, Point point, Rect rect, ChartSeries series) { double xOffset = 0, yOffset = 0, width = 20, height = 20; - bool isInversed = series.Renderer.YAxisRenderer.Axis is not null && series.Renderer.YAxisRenderer.Axis.IsAxisInverse; + bool isInversed = series.Renderer?.YAxisRenderer.Axis is not null && series.Renderer.YAxisRenderer.Axis.IsAxisInverse; if (isInversed && Chart is not null && Chart.IsTransposed) { @@ -246,7 +246,7 @@ private bool RectRegion(double x, double y, Point point, Rect rect, ChartSeries /// Tuple of (halfWidth, halfHeight) for hit testing. private static (double halfWidth, double halfHeight) GetMarkerHalfSize(ChartSeries series) { - bool needsMarkerHit = series.Type == ChartSeriesType.Scatter || (!series.Renderer.IsRectSeries() && series.Marker.Visible); + bool needsMarkerHit = series.Type == ChartSeriesType.Scatter || (series.Renderer != null && !series.Renderer.IsRectSeries() && series.Marker.Visible); if (!needsMarkerHit) { diff --git a/src/Components/Charts/Common/BaseTooltip/TooltipData.razor.cs b/src/Components/Charts/Common/BaseTooltip/TooltipData.razor.cs index 425bed6..4b6a62e 100644 --- a/src/Components/Charts/Common/BaseTooltip/TooltipData.razor.cs +++ b/src/Components/Charts/Common/BaseTooltip/TooltipData.razor.cs @@ -161,7 +161,7 @@ internal void GetTemplateOptions(SfChart chart) { ChartSeries series = chart._visibleSeriesRenderers[i].Series ?? null!; - if (!series.Visible || !(series.Renderer.Points?.Count > 0)) + if (!series.Visible || !(series.Renderer?.Points?.Count > 0)) { continue; } diff --git a/src/Components/Charts/Common/ChartUtils/ChartHelper.cs b/src/Components/Charts/Common/ChartUtils/ChartHelper.cs index 78f7518..400b57c 100644 --- a/src/Components/Charts/Common/ChartUtils/ChartHelper.cs +++ b/src/Components/Charts/Common/ChartUtils/ChartHelper.cs @@ -1593,10 +1593,10 @@ internal static ChartEventLocation TransformToVisible(double x, double y, ChartA y = yAxis.ValueType == ValueType.Logarithmic ? LogBase(y > 1 ? y : 1, yAxis.LogBase) : y; x += xAxis.ValueType == ValueType.Category && xAxis.LabelPlacement == LabelPlacement.BetweenTicks ? 0.5 : 0; - radius = (series.Renderer.Owner?._axisContainer?.AxisLayout.Radius ?? 0) * ValueToCoefficient(y, yAxis.Renderer ?? null!); + radius = (series.Renderer?.Owner?._axisContainer?.AxisLayout.Radius ?? 0) * ValueToCoefficient(y, yAxis.Renderer ?? null!); ChartEventLocation point = CoefficientToVector(ValueToPolarCoefficient(x, xAxis.Renderer ?? null!), xAxis.StartAngle); - return new ChartEventLocation((((series.Renderer.ClipRect?.Width ?? 0) / 2) + (series.Renderer.ClipRect?.X ?? 0)) + (radius * point.X), - (((series.Renderer.ClipRect?.Height ?? 0) / 2) + (series.Renderer.ClipRect?.Y ?? 0)) + (radius * point.Y)); + return new ChartEventLocation(((series.Renderer?.ClipRect?.Width ?? 0) / 2) + (series.Renderer?.ClipRect?.X ?? 0) + (radius * point.X), + ((series.Renderer?.ClipRect?.Height ?? 0) / 2) + (series.Renderer?.ClipRect?.Y ?? 0) + (radius * point.Y)); } /// @@ -1608,7 +1608,7 @@ internal static ChartEventLocation TransformToVisible(double x, double y, ChartA internal static ChartEventLocation CoefficientToVector(double coefficient, double startAngle) { startAngle = startAngle < 0 ? startAngle + 360 : startAngle; - double angle = (Math.PI * (1.5 - (2 * coefficient))) + (startAngle * Math.PI) / 180; + double angle = (Math.PI * (1.5 - (2 * coefficient))) + (startAngle * Math.PI / 180); return new ChartEventLocation(Math.Cos(angle), Math.Sin(angle)); } diff --git a/src/Components/Charts/Common/CommonLegend/LegendBase.cs b/src/Components/Charts/Common/CommonLegend/LegendBase.cs index 13eba10..2ecfd2d 100644 --- a/src/Components/Charts/Common/CommonLegend/LegendBase.cs +++ b/src/Components/Charts/Common/CommonLegend/LegendBase.cs @@ -1032,11 +1032,12 @@ internal void CalculateRenderTreeBuilderOptions() { LegendCollectionRect = new List(); int firstLegend = FindFirstLegendPosition(); + LegendOption firstLegendOption = LegendCollection[0]; - MaxItemHeight = Math.Max(ChartHelper.MeasureText(LegendCollection[0].TextCollection?.Count != 0 - ? (string.IsNullOrEmpty(LegendCollection[0].TextCollection[0]) ? "MeasureText" : LegendCollection[0].TextCollection?[0] ?? null!) - : (string.IsNullOrEmpty(LegendCollection[0].Text) ? "MeasureText" : LegendCollection[0].Text), LegendTextStyle ?? null!).Height, - (LegendCollection[0].LegendTemplate is null ? (Legend?.ShapeHeight ?? 0) : 0) + MaxItemHeight = Math.Max(ChartHelper.MeasureText(firstLegendOption.TextCollection is { Count: > 0 } textCollection + ? (string.IsNullOrEmpty(textCollection[0]) ? "MeasureText" : textCollection[0]) + : (string.IsNullOrEmpty(firstLegendOption.Text) ? "MeasureText" : firstLegendOption.Text), LegendTextStyle ?? null!).Height, + firstLegendOption.LegendTemplate is null ? (Legend?.ShapeHeight ?? 0) : 0 ); ChartRowCount = 1; diff --git a/src/Components/Charts/Common/SvgComponents/SvgPattern.razor b/src/Components/Charts/Common/SvgComponents/SvgPattern.razor index 0ed65d6..b6535b2 100644 --- a/src/Components/Charts/Common/SvgComponents/SvgPattern.razor +++ b/src/Components/Charts/Common/SvgComponents/SvgPattern.razor @@ -1,7 +1,7 @@ @namespace Syncfusion.Blazor.Toolkit.Charts.Internal - @foreach (object shape in ShapeOptions) + @foreach (object shape in ShapeOptions ?? []) { if (shape is RectOptions) {