private int GetCurrentIndex(Point point) { if (AxisPanel == null) { return(-1); } var datetime = AxisXConverter.ToData(point.X + AxisPanel.ViewportRangeX.ViewMin); datetime = datetime.AddSeconds(-datetime.Second); _pointDateTime = datetime; var remains = datetime.Minute % 15; if (remains < 3) { datetime = datetime.AddMinutes(-remains); } else if (12 < remains) { datetime = datetime.AddMinutes(15 - remains); } else if (remains == 0) { } else { datetime = datetime.AddMinutes(-remains); } return((int)(datetime.Subtract(_enquiryStartTime).TotalHours * 4)); // 4 = perHourCount 一小時4格, 15分钟数据单位 }
protected override void OnParentMouseDown(object sender, MouseButtonEventArgs e) { if (e.LeftButton != MouseButtonState.Pressed) { return; } _startPoint = e.GetPosition(this); _lastPoint = _startPoint; if (!BlockConverter.CanConvert(PointOutBlock)) { return; } _canMove = PointOutBlock != null && !BlockConverter.GetLocked(PointOutBlock); if (_canMove) { StartMouseMovementTracking(); var date = AxisXConverter.ScreenToData(0); var newDate = date.Add(StepMin); _stepMinDistance = AxisXConverter.DataToScreen(newDate); } }
public Rect MeasureDragingArea(int screenDataRowIndex) { // 取两点 画出一个范围方块 var xMin = Math.Min(_currentPoint.X, _startPoint.X); var yMin = Math.Min(_currentPoint.Y, _startPoint.Y); var xMax = Math.Max(_currentPoint.X, _startPoint.X); var yMax = Math.Max(_currentPoint.Y, _startPoint.Y); var end = AxisXConverter.ToData(xMax); _timeRange = new TimeRange(AxisXConverter.ToData(xMin), end.TimeOfDay.TotalHours > 0 ? end.Date.AddDays(1) : end); ClickDate = _timeRange.Start.Date; screenDataRowIndex = 0;//_shiftKeyPressed ? 0 : screenDataRowIndex; var maxDataRowIndex = Math.Min(GetItemsSourceCount() - 1, (int)(yMax / Interval) + screenDataRowIndex); _dataRowRange = new[] { Math.Min((int)(yMin / Interval) + screenDataRowIndex, maxDataRowIndex), maxDataRowIndex }; //Debug.Print(string.Format("y:{0}, {1}", yMax, _currentPoint.Y)); //Debug.Print(string.Format("row:{0}", _dataRowRange[1])); _measureofArea = new Rect(xMin, yMin, xMax - xMin, yMax - yMin); SelectionTimeRange = TimeRange; SelectionDataRowRange = DataRowRange; return(_measureofArea); }
protected override int GetCurrentIndex(Point point) { // var viewPortWidth = AxisPanel.HorizontalOffset;//AxisXConverter.ScreenToViewport(0); //var viewMin = AxisXConverter.ViewportToData(0); ;//AxisXConverter.ViewportToData(0); var datetime = AxisXConverter.ToData(point.X + AxisPanel.HorizontalOffset); var remains = datetime.Minute % 15; if (remains < 3) { datetime = datetime.AddMinutes(-remains); } else if (12 < remains) { datetime = datetime.AddMinutes(15 - remains); } else if (remains == 0) { } else { return(-1); } datetime = datetime.AddSeconds(-datetime.Second); // System.Diagnostics.Debug.Print(datetime.ToString()); return((int)(datetime.Subtract(_enquiryStartTime).TotalHours *PerHourCount)); }
private void RefreshChildElement() { if (AxisPanel == null) { return; } //得到相对于大容器的位置 var viewPortWidth = AxisPanel.ViewportRangeX.ViewMin;//AxisXConverter.ScreenToViewport(0); //用段的模求出偏移量 var xTranslateTransform = viewPortWidth % HourWidth; var firstSectionX = viewPortWidth - xTranslateTransform; for (var i = 0; i < VisualChildrenCount; i++) { var x = i * HourWidth - xTranslateTransform; var date = AxisXConverter.ToData(firstSectionX + (i * HourWidth)); // Debug.Print(date.ToString()); _contentPresenterList[i].Content = date; _contentPresenterList[i].Arrange(new Rect(new Point(x, 0), _contentPresenterList[i].DesiredSize)); } }
protected override void OnRender(DrawingContext drawingContext) { if (StartTime == (DateTime)StartTimeProperty.DefaultMetadata.DefaultValue || EndTime == (DateTime)EndTimeProperty.DefaultMetadata.DefaultValue || AxisPanel == null) { return; } var left = AxisXConverter.DataToScreen(StartTime); var right = Math.Min(AxisXConverter.DataToScreen(EndTime), RenderSize.Width); var width = right - left; var rect = new Rect(Math.Max(0, left), RenderSize.Height - 14, Math.Min(right >= 0 ? right : 0, width > 0 ? width : 0), 14);//14 is Line Height drawingContext.DrawRectangle(ColorRender, null, rect); if (Text == null) { return; } Text.ToFormattedText(Foreground).Self(fTxt => { if (AxisXConverter.DataToScreen(EndTime) - Text.GetTtextSize().Width < 0 || RenderSize.Width < left) { return; } var topMargin = 0; drawingContext.DrawText(fTxt, new Point(left >= 0?left:0, topMargin)); }); }
protected override double GetCellInterval() { var dateTime = AxisXConverter.ScreenToData(0); var hourWidth = AxisXConverter.DataToScreen(dateTime.AddHours(1)); //每个小时的长度除以PerHourCount; return(hourWidth / PerHourCount); }
public override void Initialize() { base.Initialize(); _startTime = AxisXConverter.ScreenToData(Math.Min(0, -AxisPanel.HorizontalOffset));//AxisXConverter.ViewportToData(0); _enquiryStartTime = _startTime.AddDays(Global.HeadDayAmount); base.OnLoaded(); }
public void MoveLeft(Rect rect) { var x = rect.Left - rect.Width; if (!AxisXConverter.IsInDataRagne(x, true)) //AxisXConverter.ScreenToData(x) < AxisPanel.StartTime { x = 0; } _currentPoint = new Point(x + rect.Width, rect.Y); _startPoint = new Point(x, _currentPoint.Y); }
internal bool IsInViewRange(out Point point) { if (InitalDrawLocation == null) { point = new Point(0, 0); return(true); } point = new Point(InitalDrawLocation.Value.X - HorizontalOffset, InitalDrawLocation.Value.Y - VerticalOffset); // 转换成相对位置 return(AxisXConverter.IsInViewRagne(point.X) && AxisYConverter.IsInViewRagne(point.Y)); }
public bool TryMoveRight(Rect rect) { var x = rect.Left + rect.Width; if (!AxisXConverter.IsInDataRagne(x, true))//AxisPanel.EndTime <= AxisXConverter.ScreenToData(x) { return(false); } _startPoint = new Point(x, rect.Y); _currentPoint = new Point(x + rect.Width, rect.Y); return(true); }
protected override int GetStartIndex(double xTransform) { //得到相对于大容器的位置 //var startTime = AxisXConverter.ScreenToData(-AxisPanel.HorizontalOffset);//AxisXConverter.ViewportToScreen(0) //var screenTime = AxisXConverter.ScreenToData(xTransform); // index = screenTime.Subtract(startTime).TotalHours * PerHourCount; var screenStartTime = AxisXConverter.ScreenToData(0); return((int)(screenStartTime.Subtract(_enquiryStartTime).TotalMinutes / 15)); //return (int)index;) return(0); }
private void ChangeBlockEdgeCursor(Point point) { var left = AxisXConverter.DataToScreen(PointOutBlock.Start); var right = AxisXConverter.DataToScreen(PointOutBlock.End); //如果在边上,鼠标形状就发生变化 if ((point.X - left) < ApprochDistance) { LayerContainer.ChangeCursor(Cursors.SizeWE); FlagAdd(MouseState.LeftDirection); } else if ((right - point.X) < ApprochDistance) { LayerContainer.ChangeCursor(Cursors.SizeWE); FlagAdd(MouseState.RightDirection); } }
protected override void OnParentDragOver(DragEventArgs e) { _isDragLeave = false; var point = e.GetPosition(this); if (_startPoint == null || _startPoint.Value.X < 0) { var date = AxisXConverter.ScreenToData(0); var newDate = date.Add(StepMin); _stepMinDistance = AxisXConverter.DataToScreen(newDate); var pointTime = AxisXConverter.ScreenToData(point.X - point.X % _stepMinDistance).ConvertToMultiplesOfFive(); System.Diagnostics.Debug.Print(pointTime.ToString()); var arg = default(DragingRoutedEventArgs); var data = e.Data.GetData("Castle.Proxies.TermStyleProxy"); if (data != null) { arg = new DragingRoutedEventArgs(pointTime, data, DraggingEvent, this); RaiseEvent(arg); } if (arg != null && arg.Target != null) { _startPoint = point; _lastPoint = _startPoint; } else { _startPoint = null; _lastPoint = null; } PointOutBlock = arg == null ? null : arg.Target; } _canMove = PointOutBlock != null; if (_canMove) { MouseMoving(point); InvalidateVisual(); } }
protected void MouseMoving(Point point) { //if(_startPoint == null || _lastPoint == null) //{ // return; //} var distance = point.X - (_startPoint == null ? 0 : _startPoint.Value.X); _lastPoint = new Point(point.X - distance % _stepMinDistance, point.Y); // do not modify 每格移动,减去不到标准距离的值 //Henry modified MoveSpan = AxisXConverter.ScreenToData(GetMoveOffSet()).Subtract(AxisXConverter.ScreenToData(0)); // was => NotifyBlocknewPositionInfoList(); DropedPlacement = new TimeRange(PointOutBlock.Start.Add(MoveSpan).AddSeconds(0.1), PointOutBlock.End.Add(MoveSpan).AddSeconds(0.1)); _isMoving = true; }
protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (AxisPanel == null) { return; } var point = e.GetPosition(this); WatchTime = AxisXConverter.ScreenToData(point.X); if (_popup == null) { return; } _popup.HorizontalOffset = point.X + HorizontalOffset; _popup.VerticalOffset = point.Y - RenderSize.Height + VerticalOffset; }
private void HandleEvent(Func <IBlockGridLayer, bool> handle, Point point, RoutedEventArgs e) { if ((AxisYConverter.IsInViewRagne(point.Y) && AxisXConverter.IsInViewRagne(point.X)) || HeaderIsHitted() || e.OriginalSource != e.Source) { foreach (BlockGridLayerBase blockGridLayerBase in Children) { if (blockGridLayerBase.Visibility == Visibility.Visible) { if (handle(blockGridLayerBase)) { break; } } } } else // out of range { if (e.RoutedEvent == Mouse.MouseUpEvent) { foreach (var blockGridLayerBase in Children) { blockGridLayerBase.OnParentHitOutOfRangePrivate(); } } } //var head = Header as FrameworkElement; //IEnumerable<BlockGridLayerBase> layers; //if (head != null && point.Y <= head.ActualHeight) // layers = // Children.OfType<BlockGridLayerBase>().Where(c => (c.Region & LayerRegion.Head) == LayerRegion.Head); //else // layers = // Children.OfType<BlockGridLayerBase>().Where(c => (c.Region & LayerRegion.Body) == LayerRegion.Body); //BMK Refine Children When HandleEvent }
private void ScrollToInitalDrawLocation() { #region 自动滚动到编辑格 Point point; if (!IsInViewRange(out point)) { //Scroll to 当 InitalDrawLocation 不再可视范围内, 自动定位 if (!InitalDrawLocation.HasValue) { return; } if (!AxisYConverter.IsInViewRagne(point.Y)) { AxisPanel.SetVerticalOffset(InitalDrawLocation.Value.Y); } if (!AxisXConverter.IsInViewRagne(point.X)) { AxisPanel.SetHorizontalOffset(InitalDrawLocation.Value.X); } } #endregion }
private void SetToolTip(object sender, EventArgs e) { _timer.Stop(); if (PointOutBlock == null) { return; } var point = Mouse.GetPosition(this); if (!AxisYConverter.IsInViewRagne(point.Y) || !AxisXConverter.IsInViewRagne(point.X)) { return; } ToolTip.SaftyInvoke <ToolTip>(t => { t.IsOpen = true; t.Placement = PlacementMode.Mouse; t.Content = PointOutBlock; }); }
protected override void OnParentMouseDown(object sender, MouseButtonEventArgs e) { //xif (LayerContainer.TryPrevent()) return; if (e.LeftButton != MouseButtonState.Pressed) { return; } _startPoint = e.GetPosition(this); _lastPoint = _startPoint; FlagAdd(MouseState.MouseDown); var date = AxisXConverter.ScreenToData(0); var newDate = date.Add(StepMin); _stepMinDistance = AxisXConverter.DataToScreen(newDate); if (FlagExist(MouseState.LeftDirection) || FlagExist(MouseState.RightDirection)) { e.Handled = true; InvalidPlacement = true; // 注意 首次按下鼠标时先设定没任何拖动之前都不是有效的位置改变 StartMouseMovementTracking(); } }
protected override void OnParentMouseMove(object sender, MouseEventArgs e) { //xif (LayerContainer.TryPrevent()) return; var point = e.GetPosition(this); if (!FlagExist(MouseState.MouseDown)) { MoveStateCheck(point); // 尝试变更鼠标样式 } else { var moveDirection = MouseState.MouseOver; if (FlagExist(MouseState.LeftDirection)) { moveDirection = MouseState.LeftDirection; } if (FlagExist(MouseState.RightDirection)) { moveDirection = MouseState.RightDirection; } //未发现任何左右拉动现象 if (moveDirection == MouseState.MouseOver) { return; } //var step = AxisXConverter.ScreenToData(distance) - AxisPanel.ScreenStart; //if (!(PointOutBlock.End >= PointOutBlock.Start.AddMinutes(step.TotalMinutes)) // || !(PointOutBlock.End.AddMinutes(step.TotalMinutes) >= PointOutBlock.Start)) // return; var distance = point.X - _startPoint.X; _lastPoint = new Point(point.X - distance % _stepMinDistance, point.Y); // 刻度式移动,根据 stepMinDistance(通常为5)步进 var moveSpan = AxisXConverter.ScreenToData(GetMoveOffSet()).Subtract(AxisXConverter.ScreenToData(0)); var draggingPlacement = default(TimeRange); switch (moveDirection) { case MouseState.LeftDirection: draggingPlacement = PointOutBlock == null ? default(TimeRange) : new TimeRange(PointOutBlock.Start.Add(moveSpan).AddSeconds(0.1), PointOutBlock.End); break; case MouseState.RightDirection: draggingPlacement = PointOutBlock == null ? default(TimeRange) : new TimeRange(PointOutBlock.Start, PointOutBlock.End.Add(moveSpan).AddSeconds(0.1)); break; } InvalidPlacement = draggingPlacement == default(TimeRange) || draggingPlacement.Invalid; // 检查Start, End数据正确性(通常Start不能大于End) if (InvalidPlacement) { DropedPlacement = null; return; } DropedPlacement = draggingPlacement; e.Handled = true; InvalidateVisual(); } }
private object PointoutBlock(Point e) { var y = e.Y; //- GetHeaderHeight(); //var y1 = AxisYConverter.ScreenToData(y); //var y2 = (int)(y / Interval) + AxisYConverter.ScreenToData(0); //if (y1 != y2) // Debug.Print(string.Format("-------- ViewportToDataY called : y1 = {0} y2 = {1}", y1, y2)); // BMK Ambiguous getRowIndex PointOutDataRowIndex = AxisYConverter.ScreenToData(y); object fountBlock = null; if (ItemsSource != null && 0 <= PointOutDataRowIndex && PointOutDataRowIndex < ItemsSource.Count) { var dateTime = AxisXConverter.ScreenToData(e.X); // current mouse moved postion var positionY = y % Interval; // for Top useage if (CellMode) { var date = dateTime.Date; ItemsSource[PointOutDataRowIndex].SaftyInvoke <IEnumerable>( o => { fountBlock = o.OfType <ITerm>().FirstOrDefault(t => { //using HrDate var blockStart = BlockConverter.GetStart(t); return((date == blockStart) && !TryPrevent(t)); }); }); if (RecursivelyPointout) { ItemsSource[PointOutDataRowIndex].SaftyInvoke <IDateIndexer <DateTerm> >(o => o[date].SaftyInvoke(b => fountBlock = b)); } } else { ItemsSource[PointOutDataRowIndex].SaftyInvoke <IEnumerable>( o => { fountBlock = o.OfType <ITerm>().LastOrDefault(block => { var blockStart = BlockConverter.GetStart(block); var blockTop = BlockConverter.GetTop(block); return((blockStart <= dateTime && dateTime < block.End && blockTop <= positionY && (BlockConverter.GetHeight(block) + blockTop) >= positionY) && !TryPrevent(block)); }); }); } } if (fountBlock != null) { PointOutDataRowTop = (e.Y - e.Y % Interval) + BlockConverter.GetTop(fountBlock); } return(fountBlock); }