Exemplo n.º 1
0
        private FrameworkElement GetTimeFrameElement(ITimeRange timeFrame)
        {
            if (timeFrame == null)
            {
                throw new Exception("TimeFrame不能为null");
            }

            if (TimeFrameTemplate == null)
            {
                throw new Exception("TimeFrameTemplate不能为null");
            }

            double           timeScaleUnitTicks = TimelineHelper.GetScaleUnitTicks(TimeScaleUnit);
            FrameworkElement timeFrameElement   = TimeFrameTemplate.LoadContent() as FrameworkElement;

            timeFrameElement.DataContext = timeFrame;

            timeFrameElement.Width  = (timeFrame.EndTime - timeFrame.BeginTime).Ticks / timeScaleUnitTicks * TimeScaleUnitWidth;
            timeFrameElement.Height = 20;

            double offset = (timeFrame.BeginTime - CurrentDateTime).Ticks / timeScaleUnitTicks * TimeScaleUnitWidth + _canvas.ActualWidth / 2;

            Canvas.SetLeft(timeFrameElement, offset);

            return(timeFrameElement);
        }
Exemplo n.º 2
0
        private void InitTimeScales()
        {
            foreach (FrameworkElement oldTimeScale in _timeScalesList)
            {
                _canvas.Children.Remove(oldTimeScale);
            }

            //获取需要绘制的时间刻度的数量
            int scaleUnitCount = (int)Math.Ceiling(_canvas.ActualWidth / TimeScaleUnitWidth) + 4;

            //获取单位时间刻度时长
            long scaleUnitTick       = TimelineHelper.GetScaleUnitTicks(TimeScaleUnit);
            long startScaleUnitTicks = CurrentDateTime.Ticks - CurrentDateTime.Ticks % scaleUnitTick - scaleUnitCount / 2 * scaleUnitTick;

            for (int i = 0; i < scaleUnitCount; i++)
            {
                FrameworkElement timeScaleUnit = GetTimeScaleUnit();

                //时间刻度开始点所代表的时间刻度
                DateTime scaleDateTime = new DateTime(startScaleUnitTicks + i * scaleUnitTick);
                double   offsetValue   = (double)(scaleDateTime - CurrentDateTime).Ticks / scaleUnitTick;
                timeScaleUnit.DataContext = scaleDateTime;
                timeScaleUnit.SetValue(Canvas.LeftProperty, _canvas.ActualWidth / 2 + offsetValue * TimeScaleUnitWidth);

                _canvas.Children.Add(timeScaleUnit);
                _timeScalesList.Add(timeScaleUnit);
            }
        }
Exemplo n.º 3
0
        private void TimelineBand_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton == MouseButtonState.Pressed)
            {
                //鼠标水平移动距离
                double moveX = e.GetPosition(null).X - _dragPoint.X;

                long     timeScaleUnitTicks = TimelineHelper.GetScaleUnitTicks(TimeScaleUnit);
                long     moveTicks          = -(long)(moveX / TimeScaleUnitWidth * timeScaleUnitTicks);
                DateTime moveTempDateTime   = CurrentDateTime.AddTicks(moveTicks);
                DateTime moveTargetDateTime = moveTempDateTime;
                if (moveTempDateTime < MinDateTime)
                {
                    moveTargetDateTime = MinDateTime;
                }
                else if (moveTempDateTime > MaxDateTime)
                {
                    moveTargetDateTime = MaxDateTime;
                }

                //设置当前时间点
                CurrentDateTime = moveTargetDateTime;
                if (IsMainBand && _hostTimeline != null)
                {
                    _hostTimeline.CurrentDateTime = CurrentDateTime;
                }

                _dragPoint = e.GetPosition(null);
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// 移动时间刻度
        /// </summary>
        /// <param name="frameworkElementMoveX"></param>
        private void MoveTimeScaleUnits(double frameworkElementMoveX)
        {
            if (_timeScalesList.Count == 0)
            {
                return;
            }

            long timeScaleUnitTicks = TimelineHelper.GetScaleUnitTicks(TimeScaleUnit);

            for (int i = _timeScalesList.Count - 1; i >= 0; i--)
            {
                double scaleUnitLeft = frameworkElementMoveX + Canvas.GetLeft(_timeScalesList[i]);
                Canvas.SetLeft(_timeScalesList[i], scaleUnitLeft);

                //移出超过范围的TimeScaleUnit
                if (scaleUnitLeft < -TimeScaleUnitWidth * 3 || scaleUnitLeft > _canvas.ActualWidth + TimeScaleUnitWidth * 2)
                {
                    _canvas.Children.Remove(_timeScalesList[i]);
                    _timeScalesList.RemoveAt(i);
                    continue;
                }
            }

            FrameworkElement firstScaleElement = _timeScalesList.First();
            int frontAddScaleUnitCount         = (int)(Canvas.GetLeft(firstScaleElement) / TimeScaleUnitWidth) + 2;

            for (int i = 0; i < frontAddScaleUnitCount; i++)
            {
                DateTime scaleDateTime = ((DateTime)firstScaleElement.DataContext).AddTicks(-timeScaleUnitTicks);

                FrameworkElement timeScaleUnit = GetTimeScaleUnit();
                timeScaleUnit.DataContext = scaleDateTime;
                timeScaleUnit.SetValue(Canvas.LeftProperty, Canvas.GetLeft(firstScaleElement) - TimeScaleUnitWidth);

                _canvas.Children.Add(timeScaleUnit);
                _timeScalesList.Insert(0, timeScaleUnit);
            }

            int backAddScaleUnitCount = (int)Math.Ceiling((_canvas.ActualWidth - Canvas.GetLeft(_timeScalesList.Last())) / TimeScaleUnitWidth);

            for (int i = 0; i < backAddScaleUnitCount; i++)
            {
                DateTime scaleDateTime = ((DateTime)_timeScalesList.Last().DataContext).AddTicks(timeScaleUnitTicks);

                FrameworkElement timeScaleUnit = GetTimeScaleUnit();
                timeScaleUnit.DataContext = scaleDateTime;
                timeScaleUnit.SetValue(Canvas.LeftProperty, Canvas.GetLeft(_timeScalesList.Last()) + TimeScaleUnitWidth);

                _canvas.Children.Add(timeScaleUnit);
                _timeScalesList.Add(timeScaleUnit);
            }
        }
Exemplo n.º 5
0
        private void UpdateTimelineBandElementsPositionByDateTime(DateTime oldDateTime, DateTime newDateTime)
        {
            long timeScaleUnitTicks = TimelineHelper.GetScaleUnitTicks(TimeScaleUnit);

            //TimelineBand元素水平移动距离
            double frameworkElementMoveX = (oldDateTime - newDateTime).Ticks / (double)timeScaleUnitTicks * TimeScaleUnitWidth;

            //移动时间刻度
            MoveTimeScaleUnits(frameworkElementMoveX);

            //移动时间片段
            MoveTimeFrameElements(frameworkElementMoveX);
        }
Exemplo n.º 6
0
        private void TimelineBand_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            _isDragging = true;
            _dragPoint  = e.GetPosition(null);

            RoutedEventArgs timelineBandStartDragEventArgs = new RoutedEventArgs(TimelineBandStartDragEvent, this);

            RaiseEvent(timelineBandStartDragEventArgs);

            if (e.ClickCount >= 2)
            {
                Point    clickPoint    = e.GetPosition(_canvas);
                DateTime clickDateTime = CurrentDateTime.AddTicks((long)((clickPoint.X - _canvas.ActualWidth / 2) / TimeScaleUnitWidth * TimelineHelper.GetScaleUnitTicks(TimeScaleUnit)));
                TimelineBandDoubleClickEventArgs args = new TimelineBandDoubleClickEventArgs(TimelineBandDoubleClickEvent, this, clickDateTime);

                RaiseEvent(args);
            }

            CaptureMouse();
        }