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