2011-01-12 4 views
2

Ich habe eine ColumnSeries mit Daten gebunden und es wird korrekt angezeigt. Wenn eine Spalte mit der rechten Maustaste angeklickt wird, möchte ich herausfinden, was der Wert für die unabhängige Achse (X) ist. Im Idealfall möchte ich ein Kontextmenü mit diesen Informationen anzeigen.C# WPF ChartingToolKit: Wie erhalten Sie einen Wert für die unabhängige Achse von ColumnSeries in MouseRightButtonDown?

Ich habe einen MouseRightButtonDown-Handler, aber kann nicht herausfinden, wie man den Hit-Test durchführt, um die X-Achseninformationen zu erhalten.

Ich habe die Auswahl aktiviert, möchte aber keine Spalte vor dem Rechtsklick auswählen müssen.

Jede Hilfe wäre willkommen!

Antwort

0

Hier ist der Beispielcode, der funktioniert.

MainWindow.xaml:

<Window x:Class="ColumnSeriesApp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
    xmlns:local="clr-namespace:ColumnSeriesApp" 
     Title="Pet Data" Height="350" Width="525"> 

MainWindow.xaml.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
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; 

namespace ColumnSeriesApp 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public PetData m_PetData; 
    public MainWindow() 
    { 
     m_PetData = new PetData(); 
     DataContext = m_PetData; 
     InitializeComponent(); 
    } 

    private void m_colserHistogram_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     // Figure out what column we are on and display a popup menu based on the information. 
     IInputElement ieMouseOver = e.MouseDevice.DirectlyOver; 
     Rectangle rMouseOver = (Rectangle)ieMouseOver; 
     string strMouseOverContext= rMouseOver.DataContext.ToString(); 
     string strMouseOverKey= ""; 
     foreach (var vKvP in m_PetData) 
     { 
      if (1 == strMouseOverContext.IndexOf(vKvP.Key)) 
       strMouseOverKey = vKvP.Key; 
     } 

     if (!String.IsNullOrEmpty(strMouseOverKey)) 
      MessageBox.Show("The X value is " + strMouseOverKey); 
    } 
} 

public class PetData : Dictionary<string, int> 
{ 
    public PetData() 
    { 
     Add("SallyBeagle", 7); 
     Add("Cujo", 10); 
     Add("DobyDeedle", 11); 
     Add("Caramel", 6); 
     Add("Boo", 6); 
    } 
} 
} 

Es scheint ziemlich gut zu funktionieren. Wenn Rick nicht mit einer Idee zurückgekommen wäre, hätte ich wahrscheinlich eine Weile aufgehört zu suchen - danke für die Motivation!

Jetzt - ist diese Lösung alle MVVM und was nicht? Es fühlt sich immer noch ein wenig an wie ein Hack ....

1

Sie können den visuellen Baum auf der Suche nach einem ColumnDataPoint gehen.

Hier ist ein Beispieldiagramm:

<Grid MouseLeftButtonDown="Grid_MouseLeftButtonDown"> 
    <Grid.Resources> 
     <PointCollection x:Key="sampleData"> 
      <Point X="1" Y="6"/> 
      <Point X="2" Y="4"/> 
      <Point X="3" Y="8"/> 
     </PointCollection> 
    </Grid.Resources> 
    <chartingToolkit:Chart Title="Chart Title"> 
     <chartingToolkit:ColumnSeries Name="chart1" Title="Column Series" ItemsSource="{StaticResource sampleData}" IndependentValueBinding="{Binding X}" DependentValueBinding="{Binding Y}"/> 
    </chartingToolkit:Chart> 
</Grid> 

und mit diesem Code-behind:

private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    var element = Mouse.DirectlyOver as DependencyObject; 
    while (element != null && !(element is ColumnDataPoint)) 
    { 
     element = VisualTreeHelper.GetParent(element); 
    } 
    if (element != null) 
    { 
     var columnDataPoint = element as ColumnDataPoint; 
     Debug.WriteLine("X = " + columnDataPoint.IndependentValue); 
     Debug.WriteLine("Y = " + columnDataPoint.DependentValue); 
    } 
} 

die X- und Y-Werte für das Element wird die Maus über, wenn die linke Maus ausgedruckt werden Schaltfläche wird angeklickt.

+0

Das sah ein wenig kompliziert aus und machte mich schmutzig :) Ich stocherte im Debugger herum und fand etwas, das gut aussah. Dann bemerkte ich, dass es ein bisschen wie etwas von dem aussieht, was du hast. Hier ist es kürzer und süßer, aber ich bin mir nicht sicher, ob es so elegant ist, wie es sein sollte .... – GTAE86

Verwandte Themen