【问题标题】:oxyPlot delete coordinate pointsoxyPlot 删除坐标点
【发布时间】:2017-02-22 05:56:16
【问题描述】:

我正在使用带有 OxyPlot 的 C# WPF 应用程序

如何再次从坐标系中删除坐标点?是否有“清除”命令? 我想,例如,如果我点击一个按钮,“圆圈”在坐标系中消失

我试过了

Points.Clear();

不幸的是错误的方法你对我有正确的方法,因为我可以删除我在坐标系中的坐标?

<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();
        }
    }
}

【问题讨论】:

    标签: c# wpf coordinates coordinate-systems oxyplot


    【解决方案1】:

    您可以将ItemsSource 设置为null

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

    编辑

    如果不想改变坐标轴的值,可以设置最小值和最大值属性:

     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;
     }
    

    【讨论】:

    • 感谢您的回答。这就是解决方案。
    【解决方案2】:

    首先,不要混淆 DataBinding 和 CodeBehind-Operations。

    您以正确的方式绑定了点。但是你需要使用ObservableCollection&lt;T&gt;

    覆盖 ItemsSource 可能会在您的应用程序中产生意外行为。

    请参阅以下代码,了解我是如何做到这一点的:

    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();
    }
    

    我保留了 XAML 的原样。

    注意

    虽然其他答案可能有效,但如果您的应用程序变得更复杂,它可能会产生一些问题

    【讨论】:

    • 非常感谢
    • button_Click() 在这种情况下不起作用。您应该明确设置 ItemsSource。
    • @Ramin 嗯嗯什么? ItemsSource 由 xaml 绑定...无需在 CodeBehind 中对其进行任何操作
    • @lok​​usking 事实上,这是我在上一个问题中的第一个建议。但是,它在我使用的版本(2015.1.1046)中不起作用。其他人也有类似的问题。见thisthis
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2020-07-15
    • 2019-02-28
    • 1970-01-01
    相关资源
    最近更新 更多