在 Xamarin Forms 编辑器中设置 CursorPosition

Set CursorPosition in Editor Xamarin Forms

如何在Editor中设置CursorPosition。我们可以在Entry中设置CursorPostion,但是在Editor中如何设置呢?我知道我们可以在 Xamarin Forms 中使用 Custom Renderer 来实现,但是如何实现呢?

我们无法像在 Entry 中那样在 Editor 中设置 CursorPosition。我们需要使用 Custom Renderer.

使用自定义渲染器可以在 Xamarin Forms 中实现大部分本机功能和实现。

在 Xamarin Forms 中 Editor 设置光标位置。 对于像我这样的初学者来说,这个答案可能有点长,所以请耐心等待。

在你的共享项目中添加一个ClassEditorExtended.cs

public class EditorExtended : Editor
{
}

在你的XAML页面添加命名空间以供参考

<xmlns:Local="clr-namespace:ApplicationName.FolderNameThatContainsEditorExtended class">

<!-- If EditorExtended.cs is in "Controls" Folder-->
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage ...
             xmlns:Local="clr-namespace:MyApplication.Controls">
            
             ...

    <StackLayout HorizontalOptions="Center">             
        <Local:EditorExtended x:Name="CustomEditor"></Local:EditorExtended>
    </StackLayout>
  • 现在在您的 Android 项目 中添加自定义渲染器。新建一个文件夹,添加EditorRendererExtended.cs
[assembly: ExportRenderer(typeof(EditorExtended), typeof(EditorRendererExtended))]
namespace MyApplication.Droid.PlatformSpecific.ExtendedControls
{
    public class EditorRendererExtended : EditorRenderer
    {
        public EditorRendererExtended(Context context) : base(context)
        {
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (Control != null)
            {
                Control.RequestFocus();                
                Control.SetSelection(Control.Text.Length);                
            }
        }       
    }
}
  • UWP 项目类似 创建一个文件夹并在平台特定代码中添加自定义渲染器。
[assembly: ExportRenderer(typeof(EditorExtended), typeof(EditorRendererExtended))]
namespace MyApplication.UWP.PlatformSpecific.ExtendedControls
{
    public class EditorRendererExtended: EditorRenderer
    {
        public EditorRendererExtended()
        {
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (Control != null)
            {
                Control.Focus(Windows.UI.Xaml.FocusState.Pointer);
                Control.SelectionStart = Control.Text.Length;
            }
        }
    }
}
  • 我没在iOS测试过,不过方法应该差不多。只需在 iOS 的 Platform Specific 文件夹中添加 EditorRendererExtended.cs class。此代码未经测试,如果您知道解决方案,可以自由编辑答案。这是我已经实现但未测试的代码。
[assembly:ExportRenderer(typeof(EditorExtended), typeof(EditorRendererExtended))]
namespace MyApplication.iOS.PlatformSpecific.ExtendedControls
{
    public class EditorRendererExtended : EditorRenderer
    {
        public EditorRendererExtended()
        {
        }

        protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            base.OnElementPropertyChanged(sender, e);
            if (Control != null)
            {
                // just change this statement to the one that works.
                Control.SelectedTextRange = Control.GetTextRange(fromPosition: Control.BeginningOfDocument, toPosition: Control.BeginningOfDocument);
            }
        }
    }
}

不要忘记在您要定位的所有平台特定代码中包含以下语句,否则它将无法工作

[assembly: ExportRenderer(typeof(EditorExtended), typeof(EditorRendererExtended))]

EditorRendererExtended 因平台而异,您可以更改其名称,如 EditorRendererExtendedAndroid EditorRendererExtendedUWP 以便更好地理解。我刚刚将它们命名为相似的,因为我发现不需要以不同的方式命名它们并且使它不必要地冗长。