Xamarin Forms:与 Label 相比,当粘贴 RTL 文本时,编辑器在 iOS 上表现得很奇怪

Xamarin Forms: Editor acts weird on iOS when RTL text is pasted in comparison to Label

在 Xamarin Forms 中,我创建了一个 Editor 和一个 Label 来测试 RTL 文本在两者中的显示方式。如果我复制 RTL 文本并将其粘贴到 Editor,它看起来很奇怪,而 Label 看起来是正确的。

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="App3.MainPage">

    <StackLayout Orientation="Vertical" Padding="20,60" Spacing="20" BackgroundColor="Beige">
        <Editor x:Name="Editor" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" Completed="Editor_OnCompleted"/>

        <Label x:Name="Label" LineBreakMode="WordWrap"/>
    </StackLayout>
</ContentPage>

这是隐藏代码:

using System;
using System.ComponentModel;
using Xamarin.Forms;

namespace App3
{
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void Editor_OnCompleted(object sender, EventArgs e)
        {
            Label.Text = Editor.Text;
        }
    }
}

复制的文本在样本(阿拉伯语)下的 https://r12a.github.io/scripts/tutorial/summaries/arabic 上。

这是输出:

当我在 iOS 上使用 Twitter 时,UITextViewUILabel 表现相同。如何更改 Editor 的行为,使粘贴的文本与 Label 中的文本相同?我喜欢 Twitter 更好地处理这个问题的方式。另外,在 Android 我没有这个问题。

我不知道文字在说什么,但在每个元素中明确设置了 FlowDirection

我会添加它并检查

<Editor x:Name="Editor" 
        HorizontalOptions="FillAndExpand" 
        VerticalOptions="FillAndExpand" 
        FlowDirection="RightToLeft" 
        Completed="Editor_OnCompleted"/>

<Label x:Name="Label" 
       FlowDirection="RightToLeft" 
       LineBreakMode="WordWrap"/>

我们已经测试过,这个问题只发生在 Xamarin.forms 项目中。它在 Xamarin.iOS 项目中运行良好。

我们发现了一个解决方法,您可以使用 Native Views in XAML 来加载这些文本。

同时还有一个limitation that it's not possible to name a native view with the x:Name attribute, it is possible to retrieve a native view instance declared in a XAML file from its code-behind file in a Shared Access Project

因此,如果您想使用本机 UITextView 在代码中执行任何操作,则必须转移到共享资产项目,而不是使用 .NET Standard 项目来共享代码。这可能是也可能不是您的可行解决方案。

顺便说一句,在 Github 中提出了一个 issue,您可以关注它以获取最新信息。