コード例 #1
0
 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);
 }
コード例 #2
0
        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);
        }
コード例 #3
0
        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));
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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
        }
コード例 #6
0
ファイル: EditControlLayer.cs プロジェクト: agamat/Ribbon-1
        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
        }
コード例 #7
0
ファイル: PointOutLayer.cs プロジェクト: agamat/Ribbon-1
        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;
            });
        }
コード例 #8
0
        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);
        }
コード例 #9
0
        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 滚动来引发重绘
        }