Xamarin Forms 在编辑器控件中获取光标位置

Xamarin Forms get cursor position in editor control

如何获取光标在编辑器控件中的位置?

我一直在寻找答案,但我能找到的最好的答案是 Cursor class,但它似乎不存在于 xamarin 中。

您可以自定义编辑器,并使用 custom renderer 获取 EditTextSelectionPosition

在您的表单项目中自定义一个 FormEditor

public class FormEditor:Editor
{
    public int SelectionPosition;

    public EventHandler SelectChanageEvent { get; set; }
}

在您的 Android 项目中创建 AndroidEditor

class AndroidEditor : EditorRenderer, EditTextSelectChange
{
    private Context mContext;

    public AndroidEditor(Context context) : base(context)
    {
        mContext = context;
    }

    public void Change(int lastPos, int curPos)
    {

        ((FormEditor)Element).SelectionPosition = curPos;
        ((FormEditor)Element).SelectChanageEvent.Invoke(this, null);
    }

    protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
    {
        base.OnElementChanged(e);
        MyEditText myEditText = new MyEditText(mContext);
        myEditText.SetEditTextSelectChange(this);
        SetNativeControl(myEditText);

    }
}

在您的 Android 项目中自定义 MyEditText

public class MyEditText : FormsEditText
{

    private int mLastPos = 0;
    private int mCurPos = 0;
    private EditTextSelectChange editTextSelectChange;

    public void SetEditTextSelectChange(EditTextSelectChange editTextSelectChange)
    {
        this.editTextSelectChange = editTextSelectChange;
    }
    public MyEditText(Context context) : base(context)
    {
    }


    protected override void OnSelectionChanged(int selStart, int selEnd)
    {
        base.OnSelectionChanged(selStart, selEnd);
        if (editTextSelectChange != null)
        {
            mCurPos = selEnd;
            editTextSelectChange.Change(mLastPos, mCurPos);
            mLastPos = mCurPos;
        }
    }
    public interface EditTextSelectChange
    {
        void Change(int lastPos, int curPos);
    }
}

然后在您的 page.xaml 中使用:

 <local:FormEditor x:Name="editor" Placeholder="Hello"></local:FormEditor>

在你的 page.xaml.cs:

public YourPage()
  {
        InitializeComponent();
        editor.SelectChanageEvent += SelectEvent;
  }

  
  private void SelectEvent(object sender, EventArgs e)
  {
     // you could get the Curson Position by editor.SelectionPosition
     Console.WriteLine("curPos = {0}", editor.SelectionPosition);
  }