在 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 以便更好地理解。我刚刚将它们命名为相似的,因为我发现不需要以不同的方式命名它们并且使它不必要地冗长。
如何在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 以便更好地理解。我刚刚将它们命名为相似的,因为我发现不需要以不同的方式命名它们并且使它不必要地冗长。