2017-02-21 8 views
1

(C# приложение для WPF)Draw графики - показать только отдельные точки

У меня есть проблема, и я должен «сделать» систему координат и ввести только координаты (без линий), как показано в картина.

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

Я хотел бы использовать библиотеку, потому что я должен сделать кадр, и я думал, что с библиотекой было бы легко. Итак, я обнаружил GnuPlot, Oxyplot и нарисую себя. GnuPlot, к сожалению, глуп, поскольку у него нет библиотеки для приложения C#. (Или, если у вас есть, пожалуйста, дайте мне знать). Поэтому я использовал OxyPlot, но, к сожалению, OxyPlot показывает мне только систему координат. Теперь на мой вопрос. Есть ли что-нибудь лучшее для рисования систем координат с координатами? Он должен отвечать следующим требованиям:

  • Он должен быть предварительный просмотр приложения, то есть, если я изменю размер это должно происходить непосредственно
  • Я хотел бы сделать кадр, так что это должно помочь мне в процесс
  • должен быть библиотекой
  • она должна быть для C# приложения
  • Я хотел бы быть первой точки метки для X, координаты Y, но позже она должна быть окружности с диаметром окружности
  • позже как Bitmap

Как уже упоминалось выше, я использовал его с OxyPlot, но, к сожалению, он не рисует график (я использовал документацию образца)

Может быть, у вас есть лучшие идеи/решение для OxyPlot.

Спасибо заранее, и я рад каждому ответу.

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

ответ

0

Добавьте этот код

DataContext = this; 

после этой линии

InitializeComponent(); 

и он покажет график.Кроме того, для того, чтобы удалить строку и просто рисовать маркерами, использовать что-то вроде этого LineSeries:

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

Редактировать

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

и

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

Кстати, по какой-то причине использование ObservationCollection или InvalidatePlot (true) не работает

+0

Прежде всего, большое спасибо! Это сработало, но, к сожалению, я хотел вставить код в кнопку, когда я нажимаю на кнопку, сначала появляются координаты +. Но что-то не так. Вы видите ошибку? Вот ссылка на код: https://gist.github.com/anonymous/42525209b6eec77d1aea5006f443eea3 – GabelUndMesser

+0

Сброс LineSeries ItemsSource после добавления данных. Я предоставляю свой рабочий пример. – Ron

+0

Благодарим вас за отличную поддержку. Надеюсь, ты задаешь другой вопрос. Я хотел бы сделать запас в системе координат. Как это получить? Я попробовал его с «Маржиной», к сожалению, без успеха. Чтобы координаты не были непосредственно на краю, но имели определенное расстояние. ' ' – GabelUndMesser

Смежные вопросы