2016-10-07 6 views
1

Как вы создаете аннотацию на ходу и как вы разрешаете размещение конечного пользователя с помощью Annotation.BeginPlacement()? Я пытался сделать это несколькими способами, но не могу заставить его работать. Он должен появиться в режиме реального времени после вызова BeginPlacement().Как разрешить пользователю создавать аннотации на MSChart?

Документация по этому вопросу практически отсутствует - и в основном нет - поэтому я не могу найти никакой помощи для этой проблемы.

То, что я пробовал до сих пор, заключается в том, чтобы создать аннотацию и поместить ее с помощью AnchorX/Y, установить для всех флажков Allow-true значение true и вызвать BeginPlacement(), пока мышь перемещается, но не может видеть аннотацию при ее размещении и он не пойдет в этом месте соответственно. Например, LineAnnotation начинается в правильном положении, но не заканчивается там, где я его оставил. Когда я перемещаю его так, чтобы он начинался с моего ChartAreas {0,0}, он попадает в конечную точку.

Что я хочу знать, когда и как использовать эти инструменты? То, что я пытаюсь сделать, состоит в том, чтобы позволить пользователю нарисовать аннотации на диаграмме и использовать их в качестве инструментов при анализе диаграмм.

ответ

2

Вам нужно вычислить правильные позиции. Помните, что MouseMove не даст вам позиции (проценты) или значения (данные), а пиксели. Вы можете преобразовать их, используя различные функции осей. Официально они работают только в событии xxxPaint, но во время событий мыши они также отлично работают.

Обновление: Там два способа сделать закрепление:

  • либо с помощью «позиции», то есть процентное или «Значения», то есть значения данных.

Вот пример 1-го рода:

enter image description here

LineAnnotation laNew = null; 

    private void chart1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (cbx_drawAnnotation.Checked) 
     { 
      Axis ax = chart1.ChartAreas[0].AxisX; 
      Axis ay = chart1.ChartAreas[0].AxisY; 
      laNew = new LineAnnotation(); 
      chart1.Annotations.Add(laNew); 
      double vx = ax.ValueToPosition(ax.PixelPositionToValue(e.X)); 
      double vy = ay.ValueToPosition(ay.PixelPositionToValue(e.Y)); 
      laNew.X = vx; 
      laNew.Y = vy; 
     } 
    } 


    private void chart1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.Button.HasFlag(MouseButtons.Left) && cbx_drawAnnotation.Checked) 
     { 
      Axis ax = chart1.ChartAreas[0].AxisX; 
      Axis ay = chart1.ChartAreas[0].AxisY; 
      double vx = ax.ValueToPosition(ax.PixelPositionToValue(e.X))- laNew.X; 
      double vy = ay.ValueToPosition(ay.PixelPositionToValue(e.Y)) - laNew.Y; 
      laNew.Width = Math.Min(100, vx); 
      laNew.Height = Math.Min(100, vy); 
      laNew.LineColor = rb_green.Checked ? Color.Green : Color.Red; 
      laNew.AllowMoving = true; // optional 
     } 
    } 

Это прекрасно работает unles вам нужно изменить масштаб оси в некотором роде, как чейнинга минимум оси и/или максимум значения.

  • В случае вам нужно якоря значений данных.

Во-первых, мы должны связать Annotation к Axes, а также установить IsSizeAlwaysRelative в false. Тогда мы можем вычислить анкерные и размер значения:

private void chart1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (cbx_drawAnnotation.Checked) 
    { 
     Axis ax = chart1.ChartAreas[0].AxisX; 
     Axis ay = chart1.ChartAreas[0].AxisY; 
     laNew = new LineAnnotation(); 
     chart1.Annotations.Add(laNew); 

     laNew.IsSizeAlwaysRelative = false; 

     laNew.AxisX = ax; 
     laNew.AxisY = ay; 

     laNew.AnchorX = ax.PixelPositionToValue(e.X); 
     laNew.AnchorY = ay.PixelPositionToValue(e.Y); 

     laNew.LineColor = rb_green.Checked ? Color.Green : Color.Red; 
     laNew.AllowMoving = true; 
    } 
} 


private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.Button.HasFlag(MouseButtons.Left) && cbx_drawAnnotation.Checked) 
    { 
     Axis ax = chart1.ChartAreas[0].AxisX; 
     Axis ay = chart1.ChartAreas[0].AxisY; 

     laNew.Width = ax.PixelPositionToValue(e.X) - laNew.AnchorX; // values 
     laNew.Height = ay.PixelPositionToValue(e.Y) - laNew.AnchorY; 
    } 
} 

Обратите внимание, как я теперь можно масштабировать максимум, а также по-прежнему изменить размер диаграммы и аннотаций остаться с точками данных ..:

enter image description here

+0

Я заметил, что вы используете проценты по ширине и высоте LineAnnotation. Можно ли получить его в значениях Axis? Я разрешаю изменение размера окна (только с осью Axis min/max, без масштабирования), и линии не «изменяют размер» правильно. EDIT: Или ваш график всего 100x100 ...? – misthema

+0

Это правильно. Все значения ChartElement.Position.xxx находятся в процентах от соответствующего контейнера. Я рассмотрю переход от этого типа привязки к привязке относительно значений DataPoint. – TaW

+0

Это было бы здорово, если бы вы нашли решение ...Заранее спасибо! – misthema

Смежные вопросы