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.
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
Oui, si j'appuie sur un bouton, les points doivent être lus. – GabelUndMesser