1

为了解释我在做什么,我在图表上绘制了两个选择器,不会被选中的部分应该出现在那个蓝色矩形下方。将被选中的部分将出现在两个选择器之间的白色区域中。下图仅显示了左侧选择器。

现在,我要做的是在图表内绘制一个矩形,该矩形始终保留在绘图区域内,即使调整窗口大小也是如此。

要获得顶部、左侧和底部边界,绘制如下图所示的矩形,我执行以下操作:

(...)
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);
(...)

但这远非完美,当窗口调整大小时,它并没有绘制在正确的位置。我希望蓝色矩形始终被绘图区域网格绑定在顶部、左侧和底部。那可能吗?

图表

4

1 回答 1

2

你可能想用它StripLine来实现这一点。查看带状线类文档。此外,我建议下载图表样本,这对理解各种功能有很大帮助。

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

不知何故,我怀疑您可能还没有发现光标,这样做会使这一切变得无关紧要。但无论如何,上面的代码将按照您的描述进行。

于 2012-09-05T13:53:00.967 回答