c# - 在编辑器 Xamarin 表单中设置 CursorPosition
问题描述
我们如何设置CursorPosition
。Editor
我们可以设置CursorPostion
,Entry
但是如何设置呢Editor
?我知道我们可以在 Xamarin Forms 中使用自定义渲染器来做到这一点,但是如何实现呢?
解决方案
我们不能像我们设置CursorPosition
的Editor
那样设置它Entry
。我们需要使用自定义渲染器。
使用自定义渲染器可以在 Xamarin Forms 中实现大多数本机功能和实现。
Editor
在 Xamarin Forms 中设置光标位置。对于像我这样的初学者来说,这个答案可能有点长,所以请多多包涵。
在您的共享项目中添加一个 Class EditorExtended.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 的平台特定文件夹中添加EditorRendererExtended.cs类。此代码未经测试,如果您知道解决方案,您可以自由编辑答案。这是我已经实现但未经测试的代码。
[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以便更好地理解。我刚刚将它们命名为相似,因为我发现不需要以不同的方式命名它们,并且不必要地冗长。
推荐阅读
- flutter - 颤动如何基于空条件创建 TabBarView
- mysql - 如何在 MySQL 中将 GROUP CONCAT 与 COUNT 结合使用?
- android - 如何使用 android-api-service 和 android 应用取消下载过程谷歌驱动器?
- tensorflow - 从没有 numpy 函数的 Tensor 获取 python 字符串
- alert - zabbix 5.X 和 MS 团队集成
- javascript - 使用 Jquery 填充 AngularJS 表单
- node.js - node.js 说找不到 sqlite3 模块
- git - 克隆 GIT 存储库时,Visual Studio“自动”检查出错误的分支
- android - Google Play 商店:由于 Intent 重定向漏洞,Android 应用被拒绝
- macos - 如何在 Mac 上使用 RegExs 编辑 TTS 发音