在 Xamarin Forms 编辑器中设置光标位置。

5

如何在Editor中设置CursorPosition?我们可以在Entry中设置CursorPostion,但是在Editor中该怎么设置呢?我知道我们可以使用Xamarin Forms中的Custom Renderer来实现它,但具体该如何实现呢?


能否请下投票者解释一下为什么要点踩呢? - Junaid Pathan
1个回答

4
我们无法像在Entry中设置光标位置一样在Editor中设置CursorPosition。我们需要使用自定义渲染器。
使用自定义渲染器可以使Xamarin Forms中的大多数原生功能和实现成为可能。
要在Xamarin Forms中设置Editor中的光标位置,需要进行以下步骤。这个答案对于像我这样的初学者可能有点冗长,请耐心看完。
在您的共享项目中添加一个名为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 对于每个平台都不同,你可以像 EditorRendererExtendedAndroidEditorRendererExtendedUWP 这样更改它的名称以便更好地理解。我只是将它们命名得相似,因为我认为不需要给它们起不同的名称,这样会使其变得冗长。


1
@LeoZhu-MSFT,我想将其标记为答案,但您是否知道Stackoverflow不允许在我立即发布问题和答案时标记为答案?当我点击“标记为答案”时,它会显示“您可以明天接受自己的答案”。如果您已经对问题和答案进行了负面评价,请撤销该评价。 - Junaid Pathan
你只需要等两天时间,就可以给自己打上标记。 - Leo Zhu
@LeoZhu-MSFT,是的,我知道这一点,那你为什么说要标记为答案呢?我知道我可以在两天内将其标记为答案,我昨天发布了问题和答案,现在还需要等待一天才能将其标记为已接受的答案。 - Junaid Pathan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接