/// <summary>
        /// Обновление отображения данных
        /// </summary>
        public void UpdateCanvas()
        {
            lines.Clear();
            MainCanvas.Children.Clear();

            if (core == null)
            {
                return;
            }

            if (core.TimeMeasureList == null)
            {
                return;
            }

            //Формируем список данных для отображения
            List <TimeMeasureData> viewList = new List <TimeMeasureData>();

            foreach (TimeMeasureData data in core.TimeMeasureList)
            {
                if ((core.ScaleManager.IsContainsTime(data.TimeStart) == true) && (core.ScaleManager.IsContainsTime(data.TimeEnd) == true))
                {
                    viewList.Add(data);
                }
            }

            //если список не пуст
            if (viewList.Count != 0)
            {
                //сортируем список по значению начального времени
                viewList.Sort(delegate(TimeMeasureData d1, TimeMeasureData d2) { return(d1.TimeStart.CompareTo(d2.TimeStart)); });
                int layerNumber = 1;
                while (viewList.Count != 0)
                {
                    TimeMeasureData cur_data = viewList[0];
                    viewList.Remove(cur_data);
                    DrawData(cur_data, layerNumber);
                    List <TimeMeasureData> drawList = new List <TimeMeasureData>();
                    foreach (TimeMeasureData d in viewList)
                    {
                        if (d.TimeStart >= cur_data.TimeEnd)
                        {
                            DrawData(d, layerNumber);
                            drawList.Add(d);
                            cur_data = d;
                        }
                    }
                    foreach (TimeMeasureData d in drawList)
                    {
                        viewList.Remove(d);
                    }
                    drawList.Clear();
                    layerNumber++;
                }
            }

            core.WaveformUserControl.SetLines(lines);
        }
        void element_MouseEnter(object sender, MouseEventArgs e)
        {
            TimeMeasureData data = null;

            if (sender is TextBlock)
            {
                data = (sender as TextBlock).Tag as TimeMeasureData;
            }
            if (sender is Arrow)
            {
                data = (sender as Arrow).Tag as TimeMeasureData;
            }
            selectedTimeMeasureData = data;
        }
        /// <summary>
        /// Отобразить данные на MainCanvas
        /// </summary>
        /// <param name="data"></param>
        /// <param name="layerNumber"></param>
        private void DrawData(TimeMeasureData data, int layerNumber)
        {
            double?pos1 = core.WaveformUserControl.GetYPos(data.Variable1);
            double?pos2 = core.WaveformUserControl.GetYPos(data.Variable2);

            if ((pos1 != null) && (pos2 != null))
            {
                Point p1 = new Point(core.ScaleManager.GetOffset(data.TimeStart), 80 - layerNumber * LayerHeight);
                Point p2 = new Point(core.ScaleManager.GetOffset(data.TimeEnd), 80 - layerNumber * LayerHeight);

                if (Math.Abs(p1.X - p2.X) < 16.0d)
                {
                    return;
                }

                Arrow arrow = new Arrow();
                arrow.X1              = p1.X;
                arrow.Y1              = p1.Y;
                arrow.X2              = p2.X;
                arrow.Y2              = p2.Y;
                arrow.HeadWidth       = 10;
                arrow.HeadHeight      = 5;
                arrow.StrokeThickness = 1;
                arrow.Stroke          = Brushes.Gray;
                arrow.ContextMenu     = Resources["ContextMenuArrow"] as ContextMenu;
                arrow.Tag             = data;
                arrow.MouseEnter     += new MouseEventHandler(element_MouseEnter);
                arrow.MouseLeave     += new MouseEventHandler(element_MouseLeave);

                Point center = new Point((p1.X + p2.X) / 2.0, (p1.Y + p2.Y) / 2.0 - 10.0);

                TextBlock textBlock = new TextBlock();
                textBlock.Background          = Brushes.White;
                textBlock.Text                = TimeInterval.ToString(data.TimeEnd - data.TimeStart);
                textBlock.FontSize            = 10;
                textBlock.Width               = 50;
                textBlock.Height              = 10;
                textBlock.TextAlignment       = TextAlignment.Center;
                textBlock.TextWrapping        = TextWrapping.Wrap;
                textBlock.HorizontalAlignment = HorizontalAlignment.Stretch;
                textBlock.VerticalAlignment   = VerticalAlignment.Stretch;
                textBlock.ContextMenu         = Resources["ContextMenuArrow"] as ContextMenu;
                textBlock.Tag         = data;
                textBlock.MouseEnter += new MouseEventHandler(element_MouseEnter);
                textBlock.MouseLeave += new MouseEventHandler(element_MouseLeave);

                MainCanvas.Children.Add(textBlock);
                Canvas.SetLeft(textBlock, center.X - textBlock.Width / 2.0);
                Canvas.SetTop(textBlock, center.Y);

                MainCanvas.Children.Add(arrow);

                Point pt1   = MainCanvas.PointToScreen(p1);
                Point pt2   = MainCanvas.PointToScreen(p2);
                Line  line1 = new Line();
                line1.X1 = pt1.X;
                line1.X2 = pt1.X;
                line1.Y1 = pt1.Y;
                line1.Y2 = pos1.Value;

                Line line2 = new Line();
                line2.X1 = pt2.X;
                line2.X2 = pt2.X;
                line2.Y1 = pt2.Y;
                line2.Y2 = pos2.Value;

                lines.Add(line1);
                lines.Add(line2);
            }
        }