|
<chart:SfChart.SecondaryAxis>
<chart:NumericalAxis Minimum="70" Maximum="150" ActualRangeChanged ="NumericalAxis_ActualRangeChanged" />
</chart:SfChart.SecondaryAxis> |
|
private void NumericalAxis_ActualRangeChanged(object sender, ActualRangeChangedEventArgs e)
{
if (chart.ChartAnnotations != null)
{
chart.ChartAnnotations.Clear();
}
var data = viewModel.Collection;
for (int i = 0; i < data.Count-1; i++)
{
if (data[i].YValue > (double)e.ActualMaximum || data[i].YValue < (double)e.ActualMinimum)
{
TextAnnotation text = new TextAnnotation();
text.Text = data[i].Date.ToString("dd");
text.X1 = data[i].Date;
text.Y1 = data[i].YValue > (double)e.ActualMaximum ? (double)e.ActualMaximum - 1 : (double)e.ActualMinimum + 1;
chart.ChartAnnotations.Add(text);
}
}
} |
|
<StackLayout x:Name="stack">
</StackLayout> |
|
for (int i = 0; i < stack.Children.Count; i++)
{
if (stack.Children[i] is SfChart)
{
((SfChart)stack.Children[i]).SecondaryAxis.ActualRangeChanged += SecondaryAxis_ActualRangeChanged;
}
} |
|
private void SecondaryAxis_ActualRangeChanged(object sender, ActualRangeChangedEventArgs e)
{
var axis = sender as NumericalAxis;
ObservableCollection<Model> model = null;
foreach (var item in stack.Children)
{
if(item is SfChart && (item as SfChart).SecondaryAxis == axis)
{
SfChart chart = item as SfChart;
chart.ChartAnnotations?.Clear();
foreach (var series in chart.Series)
{
model = series.ItemsSource as ObservableCollection<Model>;
for (int j = 0; j < model.Count - 1; j++)
{
if (model[j].YValue > (double)e.ActualMaximum || model[j].YValue < (double)e.ActualMinimum)
{
TextAnnotation text = new TextAnnotation();
text.Text = model[j].Date.ToString("dd");
text.X1 = model[j].Date;
text.Y1 = model[j].YValue > (double)e.ActualMaximum ? (double)e.ActualMaximum - 1 : (double)e.ActualMinimum + 1;
chart.ChartAnnotations.Add(text);
}
}
}
break;
}
}
} |
|
<chart:SfChart VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand" x:Name="chart" Grid.Row="0" BindingContextChanged="Chart_BindingContextChanged" > |
|
List< SfChart> SfChartCollection;
private void chart_BindingContextChanged(object sender, EventArgs e)
{
SfChartCollection.Add(sender as SfChart);
(sender as SfChart).SecondaryAxis.ActualRangeChanged += SecondaryAxis_ActualRangeChanged;
} |
|
private void SecondaryAxis_ActualRangeChanged(object sender, ActualRangeChangedEventArgs e)
{
var axis = sender as NumericalAxis;
ObservableCollection<Model> model = null;
foreach (var chart in SfChartCollection)
{
if (chart.SecondaryAxis == axis)
{
chart.ChartAnnotations?.Clear();
foreach (var series in chart.Series)
{
model = series.ItemsSource as ObservableCollection<Model>;
for (int j = 0; j < model.Count - 1; j++)
{
if (model[j].YValue > (double)e.ActualMaximum || model[j].YValue < (double)e.ActualMinimum)
{
TextAnnotation text = new TextAnnotation();
text.Text = model[j].Date.ToString("dd");
text.X1 = model[j].Date;
text.Y1 = model[j].YValue > (double)e.ActualMaximum ? (double)e.ActualMaximum - 3 : (double)e.ActualMinimum + 3;
chart.ChartAnnotations.Add(text);
}
}
}
}
}
} |
Hello, I'm interested too in this topic, but I noticed that the event Chart_BindingContextChanged, in my own project, occurs when the design of the chart is not completed, so the parameter called "sender" is null and we cannot add the event SecondaryAxis_ActualRangeChanged. The cause of this situation is that minimum and maximum values are set at runtime because we load data from a web service.
Can you help me to solve this problem?
|
private void CustomNumericalAxis_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
if (e.PropertyName == "Maximum" || e.PropertyName == "Minimum")
{
var axis = sender as CustomNumericalAxis;
var sfchart = axis.Chart;
var chartAnnoatations = new ChartAnnotationCollection();
foreach (var series in sfchart.Series)
{
var viewModel = series.ItemsSource as ObservableCollection<Model>;
for (int i = 0; i < viewModel.Count; i++)
{
var model = viewModel[i];
if (model.YValue > axis.Maximum || model.YValue < axis.Minimum)
{
TextAnnotation text = new TextAnnotation();
text.Text = model.Date.ToString("dd");
text.X1 = model.Date;
text.Y1 = (double)(model.YValue > axis.Maximum ? axis.Maximum - 3 : axis.Minimum + 3);
chartAnnoatations.Add(text);
}
}
}
sfchart.ChartAnnotations = chartAnnoatations;
}
}
void Handle_DataMarkerLabelCreated(object sender, Syncfusion.SfChart.XForms.ChartDataMarkerLabelCreatedEventArgs e)
{
var series = sender as CustomLineSeries;
var sfchart = series.Chart;
var viewModel = series.ItemsSource as ObservableCollection<Model>;
var model = viewModel[e.DataMarkerLabel.Index];
if (model.YValue > sfchart.SecondaryAxis.VisibleMaximum || model.YValue < sfchart.SecondaryAxis.VisibleMinimum)
{
TextAnnotation text = new TextAnnotation();
text.Text = model.Date.ToString("dd");
text.X1 = model.Date;
text.Y1 = model.YValue > sfchart.SecondaryAxis.VisibleMaximum ? sfchart.SecondaryAxis.VisibleMaximum - 3 : sfchart.SecondaryAxis.VisibleMinimum + 3;
sfchart.ChartAnnotations.Add(text);
}
}
public class CustomLineSeries : LineSeries
{
public SfChart Chart { get; set; }
}
public class CustomNumericalAxis : NumericalAxis
{
public SfChart Chart { get; set; }
} |