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 时,UITextView
和 UILabel
表现相同。如何更改 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,您可以关注它以获取最新信息。
在 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 时,UITextView
和 UILabel
表现相同。如何更改 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,您可以关注它以获取最新信息。