简体   繁体   中英

oxyPlot delete coordinate points

I am using C # WPF application with OxyPlot

How do I remove the coordinate points from the coordinate system again? Is there a "clear" command? I would like, for example, if I click on a button, the "circles" disappear in the coordinate System

I tried it with

Points.Clear();

Unfortunately the wrong approach you have the right approach for me, as I can delete my coordinates in the coordinate system?

<Window x:Class="TestOxyPlot.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:oxy="http://oxyplot.org/wpf"
        xmlns:local="clr-namespace:TestOxyPlot"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <oxy:Plot x:Name="oxyPlot" Title="{Binding Title}" Margin="207,53,0,0">
            <oxy:Plot.Axes>
                <oxy:LinearAxis Position="Bottom" MinimumPadding="0.1" MaximumPadding="0.1"/>
                <oxy:LinearAxis Position="Left" MinimumPadding="0.1" MaximumPadding="0.1"/>
            </oxy:Plot.Axes>

            <oxy:Plot.Series>
                <oxy:LineSeries x:Name="ls" ItemsSource="{Binding Points}" LineStyle="None"  MarkerType="Square" MarkerSize="5" MarkerFill="Black"/>
            </oxy:Plot.Series>

        </oxy:Plot>
        <TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="44,64,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" MouseLeave="textBox_MouseLeave" TextChanged="textBox_TextChanged"/>
        <TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="23" Margin="44,101,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120" TextChanged="textBox1_TextChanged"/>
        <Button x:Name="button" Content="Generate" HorizontalAlignment="Left" Margin="68,174,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
        <Button x:Name="btClear" Content="Clear" HorizontalAlignment="Left" Margin="68,225,0,0" VerticalAlignment="Top" Width="75" Click="btClear_Click"/>
        <Slider x:Name="slider" HorizontalAlignment="Left" Margin="17,10,0,0" VerticalAlignment="Top" Minimum="200" Maximum="400" ValueChanged="slider_ValueChanged" SmallChange="1" Width="400"/>
        <Button x:Name="btBitmap" Content="Bitmap" HorizontalAlignment="Left" Margin="68,139,0,0" VerticalAlignment="Top" Width="75" Click="btBitmap_Click"/>
    </Grid>
</Window>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using OxyPlot;

namespace TestOxyPlot
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            oxyPlot.Width = 200;
            oxyPlot.Height = 200;
            DataContext = this;
            this.Title = "Example 2";
            double zufallszahlX;
            double zufallszahlY;
            // Zur Erstellung des Seeds
            int h = DateTime.Now.Hour;
            int m = DateTime.Now.Minute;
            int s = DateTime.Now.Second;
            String u = h.ToString() + m.ToString() + s.ToString();
            int iu = Int32.Parse(u);
            Random zufall = new Random(iu);

            zufallszahlX = zufall.NextDouble() * (10 - -10) + -10;
            zufallszahlY = zufall.NextDouble() * (10 - -10) + -10;
            this.Points = new List<DataPoint>
                {
                                  new DataPoint(zufallszahlX, zufallszahlY)
                                 /* new DataPoint(10, 13),
                                  new DataPoint(20, 15),
                                  new DataPoint(30, 16),
                                  new DataPoint(40, 12),
                                  new DataPoint(50, 12),
                                  new DataPoint(-50, -4.54541212) */
                              }; 


        }
        //public string Title { get; private set; }

        public IList<DataPoint> Points { get; private set; }

        private void textBox_MouseLeave(object sender, MouseEventArgs e)
        {


       }

        private void textBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            try
            {
                oxyPlot.Width = Int32.Parse(textBox.Text);
            }
            catch (Exception error)
            {
                MessageBox.Show("Mistake: " + error);
            }

        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            double randomNumX;
            double randomNumY;
            int h = DateTime.Now.Hour;
            int m = DateTime.Now.Minute;
            int s = DateTime.Now.Second;
            String u = h.ToString() + m.ToString() + s.ToString();
            int iu = Int32.Parse(u);
            Random zufall = new Random(iu);

            Points = new List<DataPoint>();
            for (int i = 0; i < 10; i++)
            {
                randomNumX = zufall.NextDouble() * (10 - -10) + -10;
                randomNumY = zufall.NextDouble() * (10 - -10) + -10;
                Points.Add(new DataPoint(randomNumX, randomNumY));
            }
            Points.Add(new DataPoint(0, 0));
            Points.Add(new DataPoint(-10, -10));
            ls.ItemsSource = Points;
        }



        private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
        {
            try
            {
                oxyPlot.Height = Int32.Parse(textBox1.Text);
            }
            catch (Exception error)
            {
                MessageBox.Show("Mistake: " + error);
            }
        }

        private void btClear_Click(object sender, RoutedEventArgs e)
        {
            Points.Clear();
        }

        private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            oxyPlot.Width = slider.Value;
        }

        private void btBitmap_Click(object sender, RoutedEventArgs e)
        {
            oxyPlot.ToBitmap();
        }
    }
}

You can set the ItemsSource to be null :

 private void btClear_Click(object sender, RoutedEventArgs e)
 {
     ls.ItemsSource = null;
 }

Edit

if you don't want the values of the axis change, you can set the Minimum and Maximum properties:

 private void btClear_Click(object sender, RoutedEventArgs e)
 {
    botAxis.Minimum = botAxis.InternalAxis.ActualMinimum;
    botAxis.Maximum = botAxis.InternalAxis.ActualMaximum;
    lefAxis.Minimum = lefAxis.InternalAxis.ActualMinimum;
    lefAxis.Maximum = lefAxis.InternalAxis.ActualMaximum; 
    ls.ItemsSource = null;
 }

First of all, dont mix up DataBinding and CodeBehind-Operations.

You bound the Points in a correct way. But you need to use an ObservableCollection<T>

Overriding the ItemsSource can produce an unexpected behavor in your Application.

See following code about how i got this to work:

public Window1() {
  InitializeComponent();
  oxyPlot.Width = 200;
  oxyPlot.Height = 200;
  this.Title = "Example 2";
  double zufallszahlX;
  double zufallszahlY;
  // Zur Erstellung des Seeds
  int h = DateTime.Now.Hour;
  int m = DateTime.Now.Minute;
  int s = DateTime.Now.Second;
  string u = h + m.ToString() + s;
  int iu = Int32.Parse(u);
  var zufall = new Random(iu);

  zufallszahlX = zufall.NextDouble() * (10 - -10) + -10;
  zufallszahlY = zufall.NextDouble() * (10 - -10) + -10;
  this.Points = new ObservableCollection<DataPoint> { new DataPoint(zufallszahlX, zufallszahlY) };
  this.DataContext = this;
}

public ObservableCollection<DataPoint> Points {
  get;
}

private void textBox_MouseLeave(object sender, MouseEventArgs e) {


}

private void textBox_TextChanged(object sender, TextChangedEventArgs e) {
  try {
    oxyPlot.Width = Int32.Parse(textBox.Text);
  } catch (Exception error) {
    MessageBox.Show("Mistake: " + error);
  }

}

private void button_Click(object sender, RoutedEventArgs e) {
  double randomNumX;
  double randomNumY;
  int h = DateTime.Now.Hour;
  int m = DateTime.Now.Minute;
  int s = DateTime.Now.Second;
  String u = h.ToString() + m.ToString() + s.ToString();
  int iu = Int32.Parse(u);
  Random zufall = new Random(iu);

  for (int i = 0; i < 10; i++) {
    randomNumX = zufall.NextDouble() * (10 - -10) + -10;
    randomNumY = zufall.NextDouble() * (10 - -10) + -10;
    Points.Add(new DataPoint(randomNumX, randomNumY));
  }
  Points.Add(new DataPoint(0, 0));
  Points.Add(new DataPoint(-10, -10));
}



private void textBox1_TextChanged(object sender, TextChangedEventArgs e) {
  try {
    oxyPlot.Height = Int32.Parse(textBox1.Text);
  } catch (Exception error) {
    MessageBox.Show("Mistake: " + error);
  }
}

private void btClear_Click(object sender, RoutedEventArgs e) {
  Points.Clear();
}

private void slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) {
  oxyPlot.Width = slider.Value;
}

private void btBitmap_Click(object sender, RoutedEventArgs e) {
  oxyPlot.ToBitmap();
}

I left the XAML as it was.

Note

While the other answer might work, it can produce some issues if your application gets more complex

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM