【问题标题】:Xamarin.Forms Editor Placeholder Text Not WrappingXamarin.Forms 编辑器占位符文本不换行
【发布时间】:2021-08-11 00:31:39
【问题描述】:

当占位符太长而无法放入 StackLayout 时,我的 Xamarin.forms 应用程序中的 XAML 编辑器没有包装占位符。但是,我真的很想使用编辑器,因为它可以进行多行输入和文本。请让我知道如何实现这一目标。下面是我的 XAML 代码。

<ScrollView>
<StackLayout>
<Frame BorderColor="LightGray" HasShadow="False" Padding="0">
<Editor x:Name="Editor" MaxLength="450" HeightRequest="200" Placeholder="Long placeholder text, the text should wrap but it doesn't.  It just keeps going on and not being visible on the screen"></Editor>
</Frame>
</StackLayout>
</ScrollView>

下面是我尝试将占位符文本设置为以下结果的图像:“这是非常长的占位符文本 lorem ipsum dolor sit amet hi hi hi hi”

【问题讨论】:

  • 我测试了你的代码行,它正在包装,我们可能需要更多上下文
  • 嗯,我补充说它现在在滚动视图和堆栈布局中。滚动视图可能是原因吗?
  • 没有。我用滚动视图测试,它正在包装。检查屏幕截图。 imgur.com/GPBkMhq

标签: xaml xamarin.forms


【解决方案1】:

对此的完整解决方案涉及两件事

  1. 对占位符 (UILabel) 的宽度使用 AutoLayout 约束,请参阅此XF Github Issue for the code

  2. 一旦你有了标签包装,你需要确保编辑器容器足够大以允许看到 UILabel。您可以在编辑器上使用 HeightRequest 属性,但会锁定高度。当文本太长时,锁定高度会导致控件在控件内滚动,当编辑器已经在 ScrollView 中时,这是一个问题。答案是使用 this post 再次覆盖 CustomRenderer (rickclephas) 中的 SizeThatFits 以进行救援

【讨论】:

    【解决方案2】:

    这个问题是iOS的系统设计造成的。如果你想让placeHolder在iOS中变形,你可以使用自定义渲染器(添加一个标签来显示占位符)

    using Foundation;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using UIKit;
    
    using Xamarin.Forms;
    using Xamarin.Forms.Platform.iOS;
    
    using App11.iOS;
    
    [assembly:ExportRenderer(typeof(Editor),typeof(MyEditorRenderer))]
    namespace App11.iOS
    {
        public class MyEditorRenderer: EditorRenderer
        {
    
            UILabel placeHolderLabel;
    
            protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
            {
                base.OnElementChanged(e);
    
                if(Control!=null)
                {
                    if(placeHolderLabel==null)
                    {
                        var frame = this.Bounds;
    
                        placeHolderLabel = new UILabel() {Frame = new CoreGraphics.CGRect(5,-10,380,Element.HeightRequest/2) };
                        placeHolderLabel.Lines = 0;
                        placeHolderLabel.LineBreakMode = UILineBreakMode.WordWrap;
                       // placeHolderLabel.BackgroundColor = UIColor.LightGray;
                        placeHolderLabel.TextColor = UIColor.LightGray;
                        UpdateplaceHolder();
                        NSNotificationCenter.DefaultCenter.AddObserver(this,new ObjCRuntime.Selector("UpdateplaceHolder"),UITextView.TextDidChangeNotification,null);
    
                    }
                }
    
            }
    
            [Export("UpdateplaceHolder")]
            void UpdateplaceHolder()
            {
                if (Control.Text.Length>0)
                {
    
                    this.placeHolderLabel.RemoveFromSuperview();
    
                    return;
                }
                this.placeHolderLabel.Font = this.TextView.Font;
                this.placeHolderLabel.TextAlignment = this.TextView.TextAlignment;
                this.placeHolderLabel.Text = Element.Placeholder;
                Element.Placeholder = "";
               // this.placeHolderLabel.SizeToFit();
                this.AddSubview(placeHolderLabel);
            }
        }
    }
    

    【讨论】:

    • 嗨!我试过这个解决方案。它工作了一点,但单词仍然被切断。例如,当我尝试输入“嗨,这真的是很长的占位符文本。我正在尝试为 iOS 做一个自定义渲染器。程序运行时看起来如何?”,显示的是“嗨,这真的是很长的占位符文本. 我正在(wrap, m 被剪掉一点) 用iOS 做一个自定义渲染器。程序运行时do (wrap) 的样子如何?
    • 当我尝试在不同的模拟器上测试它时,它只能在更大的屏幕上工作
    • 您需要根据您的情况设置`placeHolderLabel = new UILabel() {Frame = new CoreGraphics.CGRect(5,-10,380,Element.HeightRequest/2) } 的框架;` ,我的代码只是为了演示。
    • 如果您必须硬编码帧宽度,这将不起作用
    猜你喜欢
    • 2016-08-29
    • 2011-07-28
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2016-09-18
    相关资源
    最近更新 更多