/*________________________________________*/
 /// <summary>
 /// Рендеринг меток, точек пересечений и значений в них
 /// </summary>
 /// <param name="dc">Контекст рисования</param>
 protected void Render(DrawingContext dc)
 {
     dc.PushOpacity(0.7);
     /*Отрисовка меток*/
     for (int i = Marks.Count - 1; i >= 0; i--)
     {
         if (Macros.CheckEntryTime(CommonData.LeftTime, Marks[i].Time, CommonData.RightTime))
         {
             Point MarkPoint = new Point(this.Field.X + ToolFunctions.GetDxByTime(Marks[i].Time, CommonData.TimeInPoint, CommonData.LeftTime), this.Field.Y);
             dc.DrawLine(new Pen(Macros.ChooseBrush(i, Brushes.DarkGreen, IndexTimeMark, Brushes.Orange), 1), MarkPoint, new Point(MarkPoint.X, this.Field.Bottom));
             Rect valueRect = new Rect(new Point(MarkPoint.X + 2, MarkPoint.Y + 2), new Size(6 * 5, 26));
             dc.DrawRoundedRectangle(
                 Macros.ChooseBrush(i, new LinearGradientBrush(Colors.DarkGreen, Colors.LightGreen, 0.5),
                                    IndexTimeMark, new LinearGradientBrush(Colors.Orange, Colors.OrangeRed, 0.5)),
                 new Pen(Macros.ChooseBrush(i, Brushes.DarkGreen, IndexTimeMark, Brushes.OrangeRed), 1),
                 valueRect, valueRect.Height / 5, valueRect.Height / 5);
             ToolFunctions.DrawAutoTxt(dc, Macros.TimeSpanToString(Marks[i].Time), valueRect, Brushes.White, TextAlignment.Justify, 1.95);
         }
     }
     /*Отрисовка значений в точке пересечения линии метки и графика*/
     for (int i = CrossPoints.Count - 1; i >= 0; i--)
     {
         dc.DrawGeometry(Brushes.Brown, new Pen(Brushes.Brown, 1), new EllipseGeometry(CrossPoints[i], 1, 1));
         Rect valueRect = new Rect(new Point(CrossPoints[i].X + 2, CrossPoints[i].Y + 2), new Size(Values[i].ToString().Length * 5 + 10, 13));
         dc.DrawRoundedRectangle(Brushes.WhiteSmoke, new Pen(Brushes.White, 1), valueRect, valueRect.Height / 5, valueRect.Height / 5);
         ToolFunctions.DrawAutoTxt(dc, "0x" + Values[i].ToString("X"), valueRect, Brushes.Brown, TextAlignment.Center, 1.95);
     }
     dc.Pop();
 }
 /*----------------------------------------*/
 /// <summary>
 /// построение списка точек пересечения и списка значений в них
 /// </summary>
 protected void UpdateData()
 {
     CrossPoints.Clear();
     Values.Clear();
     for (int i = Marks.Count - 1; i >= 0; i--)
     {
         if (Macros.CheckEntryTime(CommonData.LeftTime, Marks[i].Time, CommonData.RightTime))
         {
             double X = this.Field.X + ToolFunctions.GetDxByTime(Marks[i].Time, CommonData.TimeInPoint, CommonData.LeftTime);
             foreach (GeometryGraphic geomGr in CommonData.RenderedGraphics)
             {
                 int cnt = geomGr.Points.Count;
                 for (int j = 0; j < cnt - 1; j++)
                 {
                     if ((X >= geomGr.Points[j].X) && (X < geomGr.Points[j + 1].X))
                     {
                         CrossPoints.Add(new Point(X, geomGr.Points[j].Y));
                         Values.Add(geomGr.Points[j].SourcePoint.Value);
                         break;
                     }
                 }
             }
         }
     }
 }