【问题标题】:Xamarin Forms Editor Newline Handling WorkaroundXamarin 表单编辑器换行处理解决方法
【发布时间】:2021-10-10 17:04:47
【问题描述】:

Editor 类型的 Text 属性使用了意想不到的方式来表示换行符。例如,在 Windows 上的 UWP 中,它使用 \r 而不是 Environment.NewLine 属性所宣传的 \r\n。这似乎是一些特定于平台的行为(但我希望 Windows 上的 UWP \r\n)。

网络上显示了有关此问题的一些信息,但当前版本中似乎没有解决方案: 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);                
}

有人知道这个问题的解决方案吗?还是我误会了什么大事?

【问题讨论】:

    标签: xamarin xamarin.forms xamarin.forms.editor


    【解决方案1】:

    解决方法是在 viewmodel 中定义的属性的setter method 中进行替换,然后将其绑定到 Editor 。

    类似

      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.

    【讨论】:

    • 嗨,谢谢 +1。这是我不想要的,因为我也在其他应用程序(Windows、WPF)中使用视图模型。但是,根据您的帖子,我想到的是,如果我也在那里进行反向转换,它也许可以与我在问题中描述的值转换器一起使用。我会看看。但是它可能要等到周末(因为它是一个业余爱好者项目)。谢谢你的帖子,我会及时更新的。目前,我正在做与您在视图模型中所做的类似的事情。
    • 没问题,没关系。
    • 嗨,科尔,感谢您的帖子,我得到了洞察力,我在价值转换器中犯了错误。由于我不喜欢将解决方法代码添加到视图模型中的想法,因此我发布了一个带有值转换器的版本作为答案。请告诉我,我是否应该接受你的答案(这是绝对正确的),或者我是否应该接受我个人更喜欢的答案。
    【解决方案2】:

    正如我在帖子中所说,我不喜欢污染我的视图模型的想法。然而,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}}" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多