Живые диаграммы выделяют точку нажатия с помощью ObservablePoint - PullRequest
0 голосов
/ 18 апреля 2020

Я новичок здесь и хочу спросить вас, знаете ли вы, как выделить или пометить любым цветом точку щелчка с помощью Живые диаграммы . Я использовал пример 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
    }       
}
...