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); }
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); } }
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); } }
/// <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); } }
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); }
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(); }