Hello,
Welcome to Microsoft Q&A!
You could expand the EditTextSelectChange
interface in renderer, add a method TextChanged
, and pass the data in BeforeTextChanged
and AfterTextChanged
event in MyEditText .
Create new event in custom editor in forms , invoke the event while text changes.
Custom Renderer
[assembly: ExportRenderer(typeof(MyEditor), typeof(MyRenderer))]
namespace FormsA.Droid
{
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)
{
this.BeforeTextChanged += MyEditText_BeforeTextChanged;
this.AfterTextChanged += MyEditText_AfterTextChanged;
}
string before, after;
private void MyEditText_AfterTextChanged(object sender, Android.Text.AfterTextChangedEventArgs e)
{
after = e.Editable.ToString();
if (this.editTextSelectChange != null)
{
editTextSelectChange.TextChanged(before, after);
}
}
private void MyEditText_BeforeTextChanged(object sender, Android.Text.TextChangedEventArgs e)
{
before = e.Text.ToString();
}
protected override void OnSelectionChanged(int selStart, int selEnd)
{
base.OnSelectionChanged(selStart, selEnd);
if (this.editTextSelectChange != null)
{
mCurPos = selEnd;
editTextSelectChange.change(mLastPos, mCurPos);
mLastPos = mCurPos;
}
}
public interface EditTextSelectChange
{
void change(int lastPos, int curPos);
void TextChanged(string oldValue, string newValue);
}
}
class MyRenderer : Xamarin.Forms.Platform.Android.EditorRenderer, MyEditText.EditTextSelectChange
{
Context _context;
public MyRenderer(Context context) : base(context)
{
_context = context;
}
protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
{
base.OnElementChanged(e);
MyEditText myEditText = new MyEditText(_context);
myEditText.Text = Element.Text;
myEditText.setEditTextSelectChange(this);
SetNativeControl(myEditText);
}
public void change(int lastPos, int curPos)
{
((MyEditor)Element).SelectionChange(lastPos, curPos);
}
public void TextChanged(string oldValue, string newValue)
{
((MyEditor)Element).TextChange(oldValue, newValue);
}
}
}
MyEditor
public class MyEditor : Editor
{
public static readonly BindableProperty SelectionChangedProperty =
BindableProperty.Create("SelectionChanged", typeof(EventHandler), typeof(MyEditor), null);
public event EventHandler SelectionChanged;
public void SelectionChange(int preIndex, int currentIndex)
{
EventHandler eventHandler = this.SelectionChanged;
SelectionEventArgs selectionEventArgs = new SelectionEventArgs() { lastPos = preIndex, curPos = currentIndex };
eventHandler?.Invoke((object)this, selectionEventArgs);
}
public static readonly BindableProperty MyTextChangedProperty =
BindableProperty.Create("MyTextChanged", typeof(EventHandler), typeof(MyEditor), null);
public event EventHandler<TextChangedEventArgs> MyTextChanged;
public void TextChange(string oldValue, string newValue)
{
EventHandler<TextChangedEventArgs> eventHandler = this.MyTextChanged;
TextChangedEventArgs args = new TextChangedEventArgs(oldValue, newValue);
eventHandler?.Invoke((object)this, args);
}
public class SelectionEventArgs : EventArgs
{
public int lastPos { get; set; }
public int curPos { get; set; }
}
}
Usage
<local:MyEditor SelectionChanged="SelectionChange" Text="a" MyTextChanged="MyEditor_TextChanged" />
private void MyEditor_TextChanged(object sender, TextChangedEventArgs e)
{
}
Best Regards,
Cole Xia
If the response is helpful, please click "Accept Answer" and upvote it.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.