Я хочу видеть оставшуюся аннотацию строки в mschart - PullRequest
0 голосов
/ 04 февраля 2019

В mschart я использую аннотацию строки с помощью SetAnchor (точка 8, точка 12).Если я прокручиваю график и скрываю точку 8, я не вижу оставшуюся строку аннотации (точки с 9 по 12).Я хочу видеть оставшуюся строку аннотации.помоги мне!

моя ссылка; Примеры сред для элементов управления Microsoft Chart -> Функции диаграммы -> Аннотации -> Привязка аннотаций

private void AddLineAnnotation()
{
    // create a line annotation
    LineAnnotation annotation = new LineAnnotation();

    // setup visual attributes
    annotation.StartCap = LineAnchorCapStyle.Arrow;
    annotation.EndCap = LineAnchorCapStyle.Arrow;
    annotation.LineWidth = 3;
    annotation.LineColor = Color.OrangeRed;
    annotation.ShadowOffset = 2;
    annotation.ClipToChartArea = "Default";

    // prevent moving or selecting
    annotation.AllowMoving = false;
    annotation.AllowAnchorMoving = false;
    annotation.AllowSelecting = false;

    if(Chart1.Series[0].Points.Count > 13)
    {
        // Use the Anchor Method to anchor to points 8 and 12...
        annotation.SetAnchor(Chart1.Series[0].Points[8], Chart1.Series[0].Points[12]);
    }

    // add the annotation to the collection
    Chart1.Annotations.Add(annotation);
}

enter image description here

1 Ответ

0 голосов
/ 04 февраля 2019

Это сложно.

Плохие новости: я не думаю, что это возможно.Я думаю MSChart пропустит все аннотации, которые начинаются за пределами видимой области.Возможно, причина состояла в том, чтобы избежать беспорядка, но кто может сказать ...?

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

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

В следующем примере показан код чертежа.Убедитесь, что вы разделили режимы перетаскивания для увеличения и перетаскивания, чтобы нарисовать новую аннотацию.Я использую флажок и его CheckChanged событие.

Давайте сначала посмотрим на него в действии:

enter image description here

Когда начинаетсяаннотация прокручивается, начинается рисование линий. Довольно трудно заметить ..

Вот код для 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.Для этого вы можете использовать код, например, в нижней части этой ссылки .

  • Я не кодировал ничего, кроме прямой линии.Если вы украсили свою аннотацию, возможно, вам придется расширить код;

...