【发布时间】:2015-01-16 04:48:26
【问题描述】:
AvalonEdit 中是否有一个帮助方法来选择一个类似于双击鼠标的单词?我需要它来写一个SelectWordFromCurrentCaretPosition 函数。
【问题讨论】:
标签: c# wpf avalonedit
AvalonEdit 中是否有一个帮助方法来选择一个类似于双击鼠标的单词?我需要它来写一个SelectWordFromCurrentCaretPosition 函数。
【问题讨论】:
标签: c# wpf avalonedit
不,这不会在 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 快捷键。
【讨论】:
这是我根据@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;
【讨论】: