Text
-property的Editor
类型使用意外的方式来表示换行符。例如,在windows上的UWP中,它使用\r而不是Environment.NewLine
属性所公告的\r\n。这似乎是一些特定于平台的行为(不过,我希望从windows \r\n上的UWP中看到)。
web显示了有关此问题的一些信息,但在当前版本中似乎无法找到解决方案:https://github.com/xamarin/Xamarin.Forms/pull/6823 https://github.com/xamarin/Xamarin.Forms/issues/3020。
我真的很想绕过这种行为,这样我就不必在视图模型处理中使用一些黑客了。
我试图创建一个在绑定中使用的IValueConverter
,并替换伪换行符。这很好,但是在编辑器中带来可用性问题(光标定位开始出错)。如果我能够设置UpdateSourceTrigger,这将是可行的,然而,似乎Xamarin不支持这一点。
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
if(value is string sv) {
if(sv.IndexOf("\r") > -1 && sv.IndexOf("\n") < 0) {
return sv.Replace("\r",Environment.NewLine);
}
}
return value;
}
我尝试过的另一件事是,向Editor.Completed
添加一个处理程序。这方面的问题是,绑定在事件之后执行,因此取消了我的更改。
private void TextContent_Completed(object sender, EventArgs e) {
var vm= ...
vm.TextContent= XamarinNewlineRestorer.TransformToClrSpecific(vm.TextContent);
}
,有人知道这个问题的解决方案吗?还是我误会了什么大事?
发布于 2021-10-04 00:56:30
解决方法是在setter method
中替换视图模型中定义的属性,然后将其绑定到编辑器。
有点像
public string WorkAroundContent
{
get {
switch (Device.RuntimePlatform)
{
case Device.UWP:
return _Content.Replace("\n", "\r");
default:
return _Content;
}
}
set
{
string newContent;
switch (Device.RuntimePlatform)
{
case Device.UWP:
newContent = value.Replace("\r", "\n");
break;
default:
newContent = value;
break;
}
if (_Content == newContent) return;
Content = newContent;
}
}
请参阅https://github.com/xamarin/Xamarin.Forms/issues/3020#issuecomment-507332809。
发布于 2021-10-10 00:51:09
正如我在我的帖子中所说的,我不喜欢对我的观点模型进行歪曲。然而,ColeX的回答告诉我我犯了什么错误。
最后的解决方案是创建一个带有加法的值转换器,它可以在两个方向上改变数据。这是我第一次尝试中的错误,并使Xamarin组件失去了速度。在这里,对于那些对基于值转换器的解决方案感兴趣的人来说,我认为这个解决方案是可取的:
public class XamarinWorkaroundNewlineValueConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
if (value is string stringValue && targetType == typeof(string)) {
switch (Device.RuntimePlatform) {
case Device.UWP:
return stringValue.Replace(Environment.NewLine, "\r");
default:
return stringValue;
}
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
if(value is string stringValue && targetType==typeof(string)) {
switch (Device.RuntimePlatform) {
case Device.UWP:
return stringValue.Replace("\r", Environment.NewLine);
default:
return stringValue;
}
}
return value;
}
}
在App.xaml或视图的资源部分中,声明转换器:
<[your value converter namespace]:XamarinWorkaroundNewlineValueConverter x:Key="XamarinWorkaroundNewlineValueConverter"/>
在视图中,这样使用它:
<Editor Text ="{Binding [YourTextPropertyName],Converter={StaticResource XamarinWorkaroundNewlineValueConverter}}" />
https://stackoverflow.com/questions/69415727
复制相似问题