Я новичок здесь и хочу спросить вас, знаете ли вы, как выделить или пометить любым цветом точку щелчка с помощью Живые диаграммы . Я использовал пример PointState , найденный на странице Livecharts , и попытался адаптировать его к своему коду, но он не работает. Я изменил ObservableValue на ObservablePoint , но все равно не смог заставить его работать.
public ChartValues<ObservablePoint> Chartvalues { get; set; }
public SeriesCollection SeriesCollection { get; set; }
private int movingPointIdx = -1; //-1: no point moving
public Brush DangerBrush { get; set; }
public CartesianMapper<ObservablePoint> Mapper { get; set; }
public MainWindow()
{
InitializeComponent();
Chartvalues = new ChartValues<ObservablePoint>();
initPoints();
var lineSeries = new LineSeries
{
Title = "Line 1",
Values = Chartvalues,
StrokeThickness = 4,
Fill = Brushes.Transparent,
PointGeometrySize = 15,
LineSmoothness = 0.2,
PointForeground = Brushes.White,
Configuration = Mapper,
DataLabels = false,
};
SeriesCollection = new SeriesCollection { lineSeries };
this.DataContext = this;
Mapper = Mappers.Xy<ObservablePoint>() //point state example code, which does not work
.X((item, index) => index)
.Y(item => item.X)
.Fill(item => item.X > 3 ? DangerBrush : null)
.Stroke(item => item.X < 2 ? DangerBrush : null);
DangerBrush = new SolidColorBrush(Color.FromRgb(238, 83, 80));
}
public void initPoints()
{
Chartvalues.Clear();
double[] xvals = { 1, 2, 3, 4, 5 };
double[] yvals = { 0, 1, 2, 3, 1 };
for (int i = 0; i < xvals.Length; i++)
{
Chartvalues.Add(new ObservablePoint { X = xvals[i], Y = yvals[i] });
}
}
private void ChartOnDataClick(object sender, ChartPoint p)
{
Chartvalues = (ChartValues<ObservablePoint>)SeriesCollection[0].Values;
foreach (ObservablePoint val in Chartvalues)
{
if (val.X == p.X && val.Y == p.Y) //this is the clicked point
{
movingPointIdx = Chartvalues.IndexOf(val); //activate point moving
}
}
}
public void ChartMouseMove(object sender, MouseEventArgs e) // move point
{
if (e.LeftButton != MouseButtonState.Pressed)
{
return;
}
if (movingPointIdx == -1)
{
return;
}
var newPoint = diagram.ConvertToChartValues(e.GetPosition(this));
Chartvalues[movingPointIdx].X = Math.Round(newPoint.X, 2);
Chartvalues[movingPointIdx].Y = Math.Round(newPoint.Y, 2);
double leftBoundary = 0;
double rightBoundary = Chartvalues[Chartvalues.Count - 1].X;
if (movingPointIdx > 0)
leftBoundary = Chartvalues[movingPointIdx - 1].X;
if (movingPointIdx < Chartvalues.Count - 1)
rightBoundary = Chartvalues[movingPointIdx + 1].X;
if (newPoint.X < leftBoundary)
Chartvalues[movingPointIdx].X = leftBoundary;
else if (newPoint.X > rightBoundary)
Chartvalues[movingPointIdx].X = rightBoundary;
}
private void Diagram_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
movingPointIdx = -1; //deactivate point moving
}
}