2017-02-21 4 views
1

(C# Anwendung für WPF)Zeichne Graphs - zeigen nur einzelne Punkte

Ich habe ein Problem, und ich habe auf ein Koordinatensystem „zeichnen“, und nur die Koordinaten (ohne Linien) ein, wie in der gesehen Bild.

Here you can see the coordinate system with the points. Later, only the coordinates with a circle or a point are to be specified.

Ich möchte eine Bibliothek verwenden, da muss ich auch einen Rahmen ziehen und ich dachte, mit einer Bibliothek wäre es leicht werden. Also ich habe GnuPlot, Oxyplot entdeckt und zeichne mich. GnuPlot ist leider dumm, da es keine Bibliothek für eine C# -Anwendung hat. (Oder wenn Sie eine haben, lassen Sie es mich bitte wissen). Daher habe ich OxyPlot verwendet, aber leider zeigt OxyPlot mir nur das Koordinatensystem an. Nun zu meiner Frage. Gibt es etwas Besseres, Koordinatensysteme mit den Koordinaten zu zeichnen? Es sollte die folgenden Anforderungen erfüllen:

  • Es sollte eine Vorschau-Anwendung sein, das heißt, wenn ich die Größe ändern sollte es passieren, direkt
  • Ich möchte einen Rahmen machen, so dass es mir helfen sollte in der Prozess
  • sollte es eine Bibliothek
  • sei es
  • für eine C# Anwendung sein sollte Ich mag würde erste Punktmarken für die X sein, Y-Koordinaten, aber später sollte es Kreise mit einem Kreisdurchmesser sein
  • später als Bitmap

Wie oben erwähnt, habe ich es mit OxyPlot verwendet, aber leider ist es nicht eine Grafik zeichnen (ich die Musterdokumentation verwendet)

Vielleicht haben Sie bessere Ideen/eine Lösung für OxyPlot.

Vielen Dank im Voraus, und ich bin über jede Antwort glücklich.

XAML:

<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.Series> 
        <oxy:LineSeries ItemsSource="{Binding Points}"/> 
       </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="Button" HorizontalAlignment="Left" Margin="68,174,0,0" VerticalAlignment="Top" Width="75" Click="button_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(); 
       this.Title = "Example 2"; 
       this.Points = new List<DataPoint> 
        { 
             new DataPoint(0, 4), 
             new DataPoint(10, 13), 
             new DataPoint(20, 15), 
             new DataPoint(30, 16), 
             new DataPoint(40, 12), 
             new DataPoint(50, 12) 
            }; 


      } 
      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("Message: " + error); 
       } 

      } 

      private void button_Click(object sender, RoutedEventArgs e) 
      { 

      } 

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

Antwort

0

Fügen Sie diesen Code

DataContext = this; 

nach dieser Zeile

InitializeComponent(); 

und es wird das Diagramm zeigen.Auch, um die Linie und nur zu zeichnen, um die Markierungen zu entfernen, verwenden Sie so etwas wie dieses LineSeries:

<oxy:LineSeries ItemsSource="{Binding Points}" LineStyle="None" MarkerType="Circle" MarkerSize="5" MarkerFill="Black"/> 

bearbeiten

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)); 
     } 
     ls.ItemsSource = Points; 
    } 

und

<DockPanel> 
    <Button DockPanel.Dock="Top" Click="Button_Click" Content="Click Me"/> 
    <oxy:Plot x:Name="oxyPlot" Title="{Binding Title}"> 
     <oxy:Plot.Axes> 
      <oxy:LinearAxis Position="Bottom" /> 
      <oxy:LinearAxis Position="Right" MinimumPadding="0.1" MaximumPadding="0.1"/> 
     </oxy:Plot.Axes> 
     <oxy:Plot.Series> 
      <oxy:LineSeries x:Name="ls" ItemsSource="{Binding Points}" LineStyle="None" MarkerType="Circle" MarkerSize="5" MarkerFill="Black"/> 
     </oxy:Plot.Series> 
    </oxy:Plot> 
</DockPanel> 

By the way, Aus irgendeinem Grund funktionierte die Verwendung von ObservationCollection oder InvalidatePlot (true) nicht

+0

Zunächst einmal vielen Dank! Es hat geklappt, aber leider wollte ich den Code in eine Schaltfläche einfügen, wenn ich auf einen Button klicke, werden zuerst die Koordinaten + erzeugt. Aber etwas stimmt nicht. Siehst du den Fehler? Hier ist der Link zum Code: https://gist.github.com/anonymous/42525209b6eec77d1aea5006f443eea3 – GabelUndMesser

+0

Zurücksetzen des Lineseries Itemssource, nachdem Sie die Daten hinzufügen. Ich stelle mein Arbeitsbeispiel zur Verfügung. – Ron

+0

Vielen Dank für Ihren großartigen Support. Ich hoffe, du nimmst eine andere Frage. Ich möchte einen Rand im Koordinatensystem machen. Wie bekomme ich das? Ich habe es mit der "Marge" versucht, leider ohne Erfolg. Damit sind die Koordinaten nicht direkt am Rand, sondern haben einen gewissen Abstand. ' ' – GabelUndMesser

Verwandte Themen