2017-03-06 2 views
0

J'ai un système de coordonnées avec OxyPlot. Différents points sont générés dans ce système de coordonnées. Maintenant, je serais heureux de demander les points par bouton, est-il possible de relire les points? Les points sont affichés dans le système de coordonnées.Lire les coordonnées d'OxyPlot

Ceci est par ex. Obtenir une liste des points (un point contient toujours une valeur X et une valeur Y) Ce que j'ai ensuite la liste (ou quelle que soit la solution) peut interroger et tous les points reçoivent le indiqué dans ce système de coordonnées.

enter image description here

L'image devrait rendre plus clair ce que je voudrais.

J'ai un système de coordonnées et dans ce système de coordonnées sont affichés les points qui ont été générés auparavant. Maintenant, je veux obtenir ces points du système de coordonnées dans une liste ou quelque chose de similaire.

+0

Souhaitez-vous que l'application affiche la liste des points sur certains événements, tels que l'événement de souris vers le bas? – Ron

+0

Oui, si j'appuie sur un bouton, les points doivent être lus. – GabelUndMesser

Répondre

1

Ceci est un exemple de travail qui écoute plotModel.MouseDown (Vous devez le modifier) ​​et affiche une fenêtre avec les informations requises. Notez que vous pouvez afficher la liste déroulante dans différents contrôles tels que Popup.

public partial class MainWindow : Window 
{ 
    PlotModel plotModel; 
    public MainWindow() 
    { 
     InitializeComponent(); 

     plotModel = new PlotModel { Title = "OxyPlot" }; 
     plotModel.Axes.Add(new OxyPlot.Axes.LinearAxis { Position = OxyPlot.Axes.AxisPosition.Bottom }); 
     plotModel.Axes.Add(new OxyPlot.Axes.LinearAxis { Position = OxyPlot.Axes.AxisPosition.Left, Maximum = 10, Minimum = 0 }); 
     var series1 = new OxyPlot.Series.LineSeries 
     { 
      MarkerType = MarkerType.Circle, 
      MarkerSize = 5, 
      MarkerStroke = OxyColors.White 
     }; 
     series1.Points.Add(new DataPoint(0, 6)); 
     series1.Points.Add(new DataPoint(1, 2)); 
     series1.Points.Add(new DataPoint(2, 4)); 
     series1.Points.Add(new DataPoint(3, 2)); 
     series1.Points.Add(new DataPoint(4, 7)); 
     series1.Points.Add(new DataPoint(6, 6)); 
     series1.Points.Add(new DataPoint(8, 8)); 
     series1.Smooth = true; 
     plotModel.Series.Add(series1); 
     this.Content = new OxyPlot.Wpf.PlotView() { Model = plotModel }; 
     plotModel.MouseDown += PlotModel_MouseDown; 
    } 

    private void PlotModel_MouseDown(object sender, OxyMouseDownEventArgs e) 
    { 
     var s = plotModel.Series[0] as LineSeries; // asuming that there is just one line series 
     ListBox list = new ListBox(); 
     list.Style = (Style)TryFindResource("listOfPoint"); 
     list.ItemsSource = s.Points; 
     Window win = new Window() { Content = list, Owner = this, WindowStartupLocation = WindowStartupLocation.CenterOwner }; // You can display the results in a Popup too 
     win.ShowDialog(); // You might call Show() instead. 
    } 
} 

Vous devez le style suivant

<Window.Resources> 
    <local:DataPointToStringConverter x:Key="DataPointToStringConverter"/> 
    <Style x:Key="listOfPoint" TargetType="ListBox"> 
     <Setter Property="AlternationCount" Value="1000"/> 
     <Setter Property="ItemTemplate"> 
      <Setter.Value> 
       <DataTemplate > 
        <StackPanel Orientation="Horizontal"> 
         <TextBlock > 
          <TextBlock.Text> 
           <MultiBinding Converter="{StaticResource DataPointToStringConverter}"> 
            <Binding /> 
            <Binding Path="ItemsSource" RelativeSource="{RelativeSource AncestorType=ListBox, Mode=FindAncestor}"/> 
           </MultiBinding> 
          </TextBlock.Text> 
         </TextBlock> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

qui utilise le convertisseur suivant:

public class DataPointToStringConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     DataPoint point = (DataPoint)values[0]; 
     List<DataPoint> points = ((IEnumerable<DataPoint>)values[1]).ToList(); 
     return (points.IndexOf(point) + 1).ToString() +"- (" + point.X.ToString() + " , " + point.Y.ToString() + ")"; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Vous pouvez changer la façon dont DataPoint est converti en une chaîne dans ce convertisseur.

+0

Merci pour votre grand effort! Malheureusement, il me reste un message d'erreur: élément Ressources _Les n'a pas été reconnu, ou l'élément n'a pas pu être accessed._ L'erreur est affiché sur '' Qu'est-ce que est défectueux? Merci d'avance. – GabelUndMesser

+0

Je fois vraiment si libre et ai le code défectueux que vous avez téléchargé ici. Serait bien si vous pouviez me dire quelles sont les solutions. [link] (https://gist.github.com/anonymous/70d7c04eeb853f3b3b3c3003418e71ac) [link] (https://gist.github.com/anonymous/1af6f11785c888b7a3777d064fd7edad) – GabelUndMesser

+0

Je copie coller le code dans les liens d'un nouveau projet et Ça marche. Voulez-vous s'il vous plaît créer un nouveau projet, copier le coller exactement et le tester. Faites-moi savoir si quelque chose ne va pas là-bas. (Notez également que le bouton ne sera pas affiché, car vous remplacez le contenu de la fenêtre dans le code derrière) – Ron