我们无法设置CursorPosition
in Editor
当我们设置它时Entry
。我们需要使用自定义渲染器.
使用自定义渲染器可以在 Xamarin Forms 中实现大多数本机函数和实现。
设置光标位置Editor
在 Xamarin 表单中。
对于像我这样的初学者来说,这个答案可能有点长,所以请耐心等待。
In your 共享项目添加一个类编辑器扩展.cs
public class EditorExtended : Editor
{
}
In your 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>
- 现在在你的安卓项目添加自定义渲染器。建立一个文件夹并添加编辑渲染器扩展.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,但方法类似。只需添加编辑渲染器扩展.csiOS 中平台特定文件夹中的类。该代码未经测试,如果您知道解决方案,可以自由编辑答案。这是我已经实现但未经测试的代码。
[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))]
编辑器渲染器扩展每个平台都不同,您可以更改其名称,例如Android 编辑器渲染器扩展 or 编辑器渲染器扩展UWP为了更好的理解。我只是将它们命名为相似的,因为我发现不需要以不同的方式命名它们,并且会使其不必要地冗长。