C # WPF ChartingToolKit: Как получить значение независимой оси из ColumnSeries в MouseRightButtonDown? - PullRequest
2 голосов
/ 12 января 2011

У меня есть ColumnSeries с привязанными к нему данными, и он отображается правильно. Когда по столбцу щелкают правой кнопкой мыши, я хочу выяснить, что такое значение для независимой оси (X). В идеале я хочу отобразить контекстное меню с этой информацией.

У меня есть обработчик MouseRightButtonDown, но я не могу понять, как выполнить проверку попадания для получения информации по оси X.

У меня включен выбор, но я не хочу выбирать столбец до щелчка правой кнопкой мыши.

Любая помощь будет оценена!

Ответы [ 2 ]

1 голос
/ 13 января 2011

Вы можете пройти по визуальному дереву в поисках ColumnDataPoint.

Вот пример графика:

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

и с этим кодом:

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

значения X и Y для элемента, над которым находится мышь, будут распечатаны при нажатии левой кнопки мыши.

0 голосов
/ 13 января 2011

Вот пример кода, который работает.

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

Кажется, это работает довольно хорошо. Если бы Рик не вернулся с идеей, я бы, наверное, немного перестал искать - спасибо за мотивацию!

Теперь - это решение для всех MVVM и еще много чего? Это все еще похоже на хак ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...