【问题标题】:Silverlight Toolkit : select chart series data item on right click as well as on left clickSilverlight Toolkit:右键单击和左键单击选择图表系列数据项
【发布时间】:2013-03-21 18:17:26
【问题描述】:
对不起,如果这是一个新手问题,但是,好吧,我是......我已经尝试这样做 2 天了,搜索网络并询问 arround,没有人可以帮助我,所以任何见解都会不胜感激……
我基本上需要做的是在打开上下文菜单之前用右键单击选择一个图表系列(ColumnSeries 或 LineSeries)数据点。当我处理 menuItemClick 事件时,我需要数据点的 x 轴的值。理想情况下,我希望能够在 rightclick 和 leftclick 上引发 SelectionChanged 事件,但还没有找到任何方法来做到这一点。我尝试了一些替代方案,但一直走到死胡同。这个解决方案似乎符合我对 LineSeries 的要求:Select the nearest point in a Silverlight Toolkit chart,但我的系列中有 90% 是 ColumnSeries 并且没有 serie.Points 属性,所以我又被卡住了......
【问题讨论】:
标签:
c#
mvvm
silverlight-4.0
charts
silverlight-toolkit
【解决方案1】:
最后我使用了这个解决方案:http://www.c-sharpcorner.com/uploadfile/baimey/silverlight-charts-coordinates-on-mousemove/
我想我最好把它贴出来以防其他人需要。
private void Chart_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
Series serie = sender as Series;
DateTime xAxisValue;
Point p = e.GetPosition(serie);
ICategoryAxis xAxis = (CategoryAxis)Chart.ActualAxes[0];
object xHit = xAxis.GetCategoryAtPosition(new UnitValue(p.X, Unit.Pixels));
if (SelectedObj != null)
{
xAxisValue = (DateTime)new DateTimeConverter().ConvertBack(xHit as String, typeof(String), SelectedObj.DisplayFrequency, Thread.CurrentThread.CurrentUICulture);
foreach (Frequency frequency in SelectedObj.Frequencies)
{
if(frequency == SelectedObj.DisplayFrequency)
addMenuItem(frequency, true, xAxisValue);
else
addMenuItem(frequency, false, xAxisValue);
}
cMenu.IsOpen = true;
cMenu.HorizontalOffset = e.GetPosition(LayoutRoot).X;
cMenu.VerticalOffset = e.GetPosition(LayoutRoot).Y;
}
}
private void addMenuItem(Frequency frequency, bool isDisplayFrequency, DateTime xAxisValue)
{
menuItem = new MenuItem();
menuItem.Header = frequency;
menuItem.Tag = xAxisValue;
if (isDisplayFrequency)
{
menuItem.Icon = new TextBlock { Text = "\xfc", FontFamily = new System.Windows.Media.FontFamily("Wingdings"), FontWeight = FontWeights.Bold, TextAlignment = TextAlignment.Center };
menuItem.FontWeight = FontWeights.Bold;
}
cMenu.Items.Add(menuItem);
menuItem.Click += new RoutedEventHandler(menuItem_Click);
}
void menuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem item = sender as MenuItem;
Frequency itemFreq = (Frequency)item.Header;
DateTime xAxisValue = (DateTime)item.Tag;
...
cMenu.IsOpen = false;
}