vs2008 / vs2010 имеет событие изменения позиции каретки в TextBox? - PullRequest
1 голос
/ 19 декабря 2010

Мне нужно следить за положением каретки внутри TextBox;есть ли событие для этого?Я не хочу использовать таймер для этого (например, проверять каждые 10 мс, если позиция изменилась).

Я использую Windows Forms.

Ответы [ 4 ]

2 голосов
/ 20 декабря 2010

Надеюсь, это поможет. Я сделал это с помощью мыши Move

private void txtTest_MouseMove(object sender, MouseEventArgs e)
{
   string str = "Character{0} is at Position{1}";
   Point pt = txtTest.PointToClient(Control.MousePosition);
   MessageBox.Show(
      string.Format(str
      , txtTest.GetCharFromPosition(pt).ToString()
      , txtTest.GetCharIndexFromPosition(pt).ToString())
   );
}
2 голосов
/ 19 декабря 2010

Родной элемент управления Windows не производит уведомление об этом.Попытка обойти это ограничение - это рецепт боли, вы просто не можете сказать, где находится каретка.Свойство SelectionStart является , а не надежным индикатором, каретка может появляться на любом конце выделения, в зависимости от того, в каком направлении пользователь выбрал текст.Pinvoking GetCaretPos () дает позицию каретки, когда элемент управления имеет фокус, но сопоставить его с индексом символа не так просто из-за неточностей в TextRenderer.MeasureText ().

Не переходите туда.Вместо этого объясните, почему вы думаете, что вам это нужно.

0 голосов
/ 19 декабря 2010

Я не уверен, что событие SelectionChanged запускает evon при изменении позиции каретки, но вам следует попробовать.

Если нет, вы можете создать таймер и проверить, изменяется ли значение свойства SelectionStart.

Обновление: довольно просто создать класс TextBox, который вызывает событие SelectionChanged:

public class TextBoxEx : TextBox
{

    #region SelectionChanged Event

    public event EventHandler SelectionChanged;

    private int lastSelectionStart;
    private int lastSelectionLength;
    private string lastSelectedText;
    private void RaiseSelectionChanged()
    {
        if (this.SelectionStart != lastSelectionStart || this.SelectionLength != lastSelectionLength || this.SelectedText != lastSelectedText)
            OnSelectionChanged();

        lastSelectionStart = this.SelectionStart;
        lastSelectionLength = this.SelectionLength;
        lastSelectedText = this.SelectedText;
    }

    protected virtual void OnSelectionChanged()
    {
        var eh = SelectionChanged;
        if (eh != null)
        {
            eh(this, EventArgs.Empty);
        }
    }

    #endregion

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        RaiseSelectionChanged();
    }

    protected override void OnKeyUp(KeyEventArgs e)
    {
        base.OnKeyUp(e);
        RaiseSelectionChanged();
    }

    protected override void OnMouseDown(MouseEventArgs e)
    {
        base.OnMouseDown(e);
        RaiseSelectionChanged();
    }

    protected override void OnMouseUp(MouseEventArgs mevent)
    {
        base.OnMouseUp(mevent);
        RaiseSelectionChanged();
    }

}
0 голосов
/ 19 декабря 2010

Большинство текстовых элементов управления будут иметь KeyDown и KeyUp события, которые вы можете использовать, чтобы узнать, какая клавиша была нажата.

Я связался сwinforms TextBox, так как вы не указали, какую технологию вы используете.

Однако прямого способа определить, где находится курсор в поле, нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...