【问题标题】:Select Word like Double Click in AvalonEdit在 AvalonEdit 中选择像双击一样的单词
【发布时间】:2015-01-16 04:48:26
【问题描述】:

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

【问题讨论】:

    标签: c# wpf avalonedit


    【解决方案1】:

    不,这不会在 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 快捷键。

    【讨论】:

      【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多