Это сложно.
Плохие новости: я не думаю, что это возможно.Я думаю MSChart
пропустит все аннотации, которые начинаются за пределами видимой области.Возможно, причина состояла в том, чтобы избежать беспорядка, но кто может сказать ...?
Обходной путь должен был бы учитывать случай, когда обе конечные точки находятся снаружи, и мы все еще хотели бы видеть аннотацию ..
Хорошей новостью является то, что с помощью владельца можно кодировать обходной путь, который действительно нарисует линии для обоих случаев.
В следующем примере показан код чертежа.Убедитесь, что вы разделили режимы перетаскивания для увеличения и перетаскивания, чтобы нарисовать новую аннотацию.Я использую флажок и его CheckChanged
событие.
Давайте сначала посмотрим на него в действии:
Когда начинаетсяаннотация прокручивается, начинается рисование линий. Довольно трудно заметить ..
Вот код для xxxPaint
события:
private void chart1_PostPaint(object sender, ChartPaintEventArgs e)
{
// loop only over line annotations:
List<LineAnnotation> annos =
chart1.Annotations.Where(x => x is LineAnnotation)
.Cast<LineAnnotation>().ToList();
if (!annos.Any()) return;
// a few short references
Graphics g = e.ChartGraphics.Graphics;
ChartArea ca = chart1.ChartAreas[0];
Axis ax = ca.AxisX;
Axis ay = ca.AxisY;
// we want to clip the line to the innerplotposition excluding the scrollbar:
Rectangle r = Rectangle.Round(InnerPlotPositionClientRectangle(chart1, ca));
g.SetClip(new Rectangle(r.X, r.Y, r.Width, r.Height - (int)ax.ScrollBar.Size));
g.InterpolationMode = InterpolationMode.NearestNeighbor; // pick your mode!
foreach (LineAnnotation la in annos)
{
if (Double.IsNaN(la.Width)) continue; // *
// calculate the coordinates
int x1 = (int)ax.ValueToPixelPosition(la.AnchorX);
int y1 = (int)ay.ValueToPixelPosition(la.AnchorY);
int x2 = (int)ax.ValueToPixelPosition(la.AnchorX + la.Width);
int y2 = (int)ay.ValueToPixelPosition(la.AnchorY + la.Height);
// now we draw the line if necessary:
if (x1 < r.X || x1 > r.Right)
using (Pen pen = new Pen(la.LineColor, 0.5f)) g.DrawLine(pen, x1, y1, x2, y2);
}
// reset the clip to allow the system drawing a scrollbar
g.ResetClip();
}
Несколько замечаний:
Код предполагает (*), что Annotations
все связаны с AnchorX/Y
и имеют набор Width/Height
.Если вы использовали разные способы привязки, вам нужно адаптировать код.
Для части отсечения нам нужно знать размер / положение пикселя InnerPlotPosition
.Для этого вы можете использовать код, например, в нижней части этой ссылки .
Я не кодировал ничего, кроме прямой линии.Если вы украсили свою аннотацию, возможно, вам придется расширить код;