为了解释我在做什么,我在图表上绘制了两个选择器,而未选中的部分应该出现在该蓝色矩形下面。将被选中的部分将出现在两个选择器之间的白色区域中。下图仅显示左选择器。
现在,我要做的是在图表中绘制一个矩形,该矩形始终保留在绘图区域内,即使调整了窗口大小。
要获得顶部,左侧和底部边界,以绘制如下图所示的矩形,我执行以下操作:
(...)
int top = (int)(Chart.Height * 0.07);
int bottom = (int)(Chart.Height - 1.83 * top);
int left = (int)(0.083 * Chart.Width);
Brush b = new SolidBrush(Color.FromArgb(128, Color.Blue));
e.Graphics.FillRectangle(b, left, top, marker1.X - left, bottom - top);
(...)
但这远非完美,并且在调整窗口大小时不会在正确的位置绘制。我希望蓝色矩形始终由绘图区域网格绑定在顶部,左侧和底部。这可能吗?
答案 0 :(得分:1)
您可能希望使用StripLine
来实现此目的。
查看Stripline Class Documentation。
另外,我建议下载Charting Samples,这对理解各种功能有很大帮助。
StripLine stripLine = new StripLine();
stripLine.Interval = 0; // Set Strip lines interval to 0 for non periodic stuff
stripLine.StripWidth = 10; // the width of the highlighted area
stripline.IntervalOffset = 2; // the starting X coord of the highlighted area
// pick you color etc ... before adding the stripline to the axis
chart.ChartAreas["Default"].AxisX.StripLines.Add( stripLine );
这假设您想要的东西不是Cursor
已经做过的事情(请参阅CursorX),例如让用户标记图中提供一些持久性的区域。将Cursor事件与上面的带状线组合起来是一种很好的方法。
因此,要突出显示光标的开始和结束,您可以执行此操作
// this would most likely be done through the designer
chartArea1.AxisX.ScaleView.Zoomable = false;
chartArea1.CursorX.IsUserEnabled = true;
chartArea1.CursorX.IsUserSelectionEnabled = true;
this.chart1.SelectionRangeChanged += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.CursorEventArgs>(this.chart1_SelectionRangeChanged);
...
private void chart1_SelectionRangeChanged(object sender, CursorEventArgs e)
{
chart1.ChartAreas[0].AxisX.StripLines.Clear();
StripLine stripLine1 = new StripLine();
stripLine1.Interval = 0;
stripLine1.StripWidth = chart1.ChartAreas[0].CursorX.SelectionStart - chart1.ChartAreas[0].AxisX.Minimum;
stripLine1.IntervalOffset = chart1.ChartAreas[0].AxisX.Minimum;
// pick you color etc ... before adding the stripline to the axis
stripLine1.BackColor = Color.Blue;
chart1.ChartAreas[0].AxisX.StripLines.Add(stripLine1);
StripLine stripLine2 = new StripLine();
stripLine2.Interval = 0;
stripLine2.StripWidth = chart1.ChartAreas[0].AxisX.Maximum - chart1.ChartAreas[0].CursorX.SelectionEnd;
stripLine2.IntervalOffset = chart1.ChartAreas[0].CursorX.SelectionEnd;
// pick you color etc ... before adding the stripline to the axis
stripLine2.BackColor = Color.Blue;
chart1.ChartAreas[0].AxisX.StripLines.Add(stripLine2);
}
不知怎的,我怀疑你可能还没有发现光标,这样做会使所有这些无关紧要。但无论如何,上面的代码将按照你的描述进行。