3

AvalonEdit 中是否有一个帮助方法来选择一个类似于双击鼠标的单词?我需要它来编写一个SelectWordFromCurrentCaretPosition函数。

4

2 回答 2

2

不,这没有在 API 中公开。您可以通过依次执行EditingCommands MoveLeftByWord(Ctrl+Left) 和SelectRightByWord(Ctrl+Shift+Right) 来接近,但如果插入符号放在单词的开头,这不会产生预期的效果。

EditingCommands.MoveLeftByWord.Execute(null, textEditor.TextArea);
EditingCommands.SelectRightByWord.Execute(null, textEditor.TextArea);

或者,您可以自己实现它。用于检测字边界的逻辑可作为VisualLine.GetNextCaretPosition(..., CaretPositioningMode.WordBorder).

可以查看 AvalonEdit 源代码,看看双击逻辑是如何实现的:SelectionMouseHandler.GetWordAtMousePosition()

此外,您可能想查看 的源代码CaretNavigationCommandHandler,它实现了 Ctrl+Left 和 Ctrl+Right 快捷键。

于 2014-11-19T19:25:42.703 回答
2

这是我基于@Daniel的回答的实现:

private string GetWordAtMousePosition(MouseEventArgs e)
{
    var mousePosition = this.GetPositionFromPoint(e.GetPosition(this));

    if (mousePosition == null)
        return string.Empty;

    var line = mousePosition.Value.Line;
    var column = mousePosition.Value.Column;
    var offset = Document.GetOffset(line, column);

    if (offset >= Document.TextLength)
        offset--;

    int offsetStart = TextUtilities.GetNextCaretPosition(Document, offset, LogicalDirection.Backward, CaretPositioningMode.WordBorder);
    int offsetEnd = TextUtilities.GetNextCaretPosition(Document, offset, LogicalDirection.Forward, CaretPositioningMode.WordBorder);

    if (offsetEnd == -1 || offsetStart == -1)
        return string.Empty;

    var currentChar = Document.GetText(offset, 1);

    if (string.IsNullOrWhiteSpace(currentChar))
        return string.Empty;

    return Document.GetText(offsetStart, offsetEnd - offsetStart);
}

private void OnMouseMove(object sender, MouseEventArgs e)
{
    string wordUnderCaret = GetWordAtMousePosition(e);
    Debug.Print(wordUnderCaret);
}

并将委托添加到 MouseMove 事件处理程序

TextArea.MouseMove += OnMouseMove;
于 2018-06-07T13:21:42.493 回答