示例#1
0
        protected override void OnKeyPressed(ConsoleKeyInfo key)
        {
            if (key.Modifiers.HasFlag(ConsoleModifiers.Control) || key.Modifiers.HasFlag(ConsoleModifiers.Alt))
            {
                return;
            }
            if (_caretPos > Text.Length)
            {
                _caretPos = Text.Length;
            }
            if (_caretPos < 0)
            {
                _caretPos = 0;
            }
            var prevPos = _caretPos;

            switch (key.Key)
            {
            case ConsoleKey.Backspace:
                if (_caretPos > 0)
                {
                    _caretPos--;
                    Text = Text.Remove(_caretPos, 1);
                }
                break;

            case ConsoleKey.LeftArrow:
                if (_caretPos > 0)
                {
                    _caretPos--;
                }
                break;

            case ConsoleKey.RightArrow:
                if (_caretPos < Text.Length)
                {
                    _caretPos++;
                }
                break;

            case ConsoleKey.DownArrow:
                _caretPos = _measurement.MoveCaretDown(_caretPos);
                break;

            case ConsoleKey.UpArrow:
                _caretPos = _measurement.MoveCaretUp(_caretPos);
                break;

            case ConsoleKey.Delete:
                if (_caretPos < Text.Length)
                {
                    Text = Text.Remove(_caretPos, 1);
                    if (_caretPos > Text.Length)
                    {
                        _caretPos = Text.Length;
                    }
                }
                break;

            case ConsoleKey.Enter:
                Text = Text.Insert(_caretPos++, "\n");
                break;

            default:
                if (!char.IsControl(key.KeyChar))
                {
                    Text = Text.Insert(_caretPos++, key.KeyChar.ToString());
                }
                break;
            }
            if (_caretPos != prevPos)
            {
                var point     = _measurement.CaretPosition(_caretPos);
                var prevPoint = _measurement.CaretPosition(prevPos);
                var indent    = Math.Min(2, Math.Max(0, prevPoint.X - point.X - ActualWidth + 3));
                if (ActualWidth - point.X > 0)
                {
                    indent = 0;
                }
                if (point.X + _scrollX < 0)
                {
                    _scrollX = -point.X;
                }
                if (point.X + _scrollX >= ActualWidth)
                {
                    _scrollX = ActualWidth - point.X - 1;
                }
                _scrollX += indent;
                if (point.Y + _scrollY < 0)
                {
                    _scrollY = -point.Y;
                }
                if (point.Y + _scrollY >= ActualHeight)
                {
                    _scrollY = ActualHeight - point.Y - 1;
                }
            }
            Invalidate();
        }