public bool TryMoveUp(Rect rect) { if (_screenDataRowIndex < AxisYConverter.ToData(_startPoint.Y)) // 不在位置 0 (第一笔) { _startPoint = new Point(rect.X, rect.Y <= 0 ? 0 : rect.Y - rect.Height); _currentPoint = new Point(rect.X + rect.Width, _startPoint.Y); return(true); } return(false); }
internal bool DataRowIndexIsOutOfScreen(int dataRowIndex, out double viewportTop) { var y0 = AxisPanel.GetScreenTopRowIndex(); var yMax = AxisYConverter.ScreenToData(AxisPanel.ViewportHeight); // renderSize.Height ? 高度尚未经完整测试 int dataRowScreenIndex; var outOfRange = (AxisControlExt.AxisOutOfRange(dataRowIndex, y0, yMax, out dataRowScreenIndex)); viewportTop = dataRowScreenIndex * Interval; return(outOfRange); }
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)); }
internal override double GetPointOutY() { if (!AxisYConverter.IsInViewRagne(PointOutDataRowIndex)) { if (PointOutDataRowIndex < 0) { PointOutDataRowIndex = 0; } else { PointOutDataRowIndex = ItemsSource.Count - 1; } } var rowY = AxisYConverter.DataToScreen(PointOutDataRowIndex); var y = rowY + BlockConverter.GetTop(PointOutBlock); return(y); }
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; }); }
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); }
protected override void OnParentKeyDown(object sender, KeyEventArgs e) { if (Keyboard.Modifiers == ModifierKeys.Shift) { return; } if (InitalDrawLocation == null) { return; } _screenDataRowIndex = AxisPanel.GetScreenTopRowIndex(); var prevRowIndex = AxisYConverter.ToData(InitalDrawLocation.Value.Y); switch (e.Key) { case Key.Left: MoveLeft(InitalDrawLocation.Value); MeasureDragingArea(_screenDataRowIndex); e.Handled = 0 <= ConvertToRelativePosition(_startPoint).X; break; case Key.Right: if (TryMoveRight(InitalDrawLocation.Value)) { MeasureDragingArea(_screenDataRowIndex); } e.Handled = ConvertToRelativePosition(_currentPoint).X <= RenderSize.Width; break; case Key.Up: TryMoveUp(InitalDrawLocation.Value); var moveUpRowIndex = AxisYConverter.ToData(_startPoint.Y); e.Handled = moveUpRowIndex != prevRowIndex; if (!e.Handled) { _screenDataRowIndex -= _screenDataRowIndex > 0 ? 1 : 0; // scroll up occurred } MeasureDragingArea(_screenDataRowIndex); break; case Key.Down: TryMoveDown(InitalDrawLocation.Value); var moveDownRowIndex = AxisYConverter.ToData(_startPoint.Y); if ((RenderSize.Height - AxisYConverter.DataToScreen(moveDownRowIndex)) < Interval) // 屏幕最后一格未满 { e.Handled = false; } else { e.Handled = moveDownRowIndex != prevRowIndex; } MeasureDragingArea(_screenDataRowIndex); if (!e.Handled) { _screenDataRowIndex += GetItemsSourceCount() - 1 <= moveDownRowIndex ? 0 : 1; // scroll down occurred } break; default: ClickCount = 0; break; } SetInitalDrawLocation(); if (e.Handled) { InvalidateVisual(); //未发生scroll bar 卷动, 手动刷新 cell 新的位置 } else { LayerContainer.Focus(); } // e.Handled 如果为 false 代表由 scroll bar 滚动来引发重绘 }