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