Xamarin Forms将占位符添加到iOS的编辑器中

时间:2017-01-03 17:41:23

标签: xamarin.ios xamarin.forms

如何在Xamarin Forms for iOS中为编辑器添加占位符?

我尝试通过自定义渲染器添加为Control.Layer,但找不到与之相关的属性。

请帮忙。

5 个答案:

答案 0 :(得分:7)

请尝试以下代码:

<强> PCL:

using UIKit;
using ABC.CustomViews;
using ABC.iOS.CustomRenderer;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRenderer(typeof(PlaceholderEditor), typeof(PlaceholderEditorRenderer))]
namespace ABC.iOS.CustomRenderer
{
    public class PlaceholderEditorRenderer : EditorRenderer
    {
        private string Placeholder { get; set; }

        protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
        {
            base.OnElementChanged(e);
            var element = this.Element as PlaceholderEditor;

            if (Control != null && element != null)
            {
                Placeholder = element.Placeholder;
                Control.TextColor = UIColor.LightGray;
                Control.Text = Placeholder;

                Control.ShouldBeginEditing += (UITextView textView) =>
                {
                    if (textView.Text == Placeholder)
                    {
                        textView.Text = "";
                        textView.TextColor = UIColor.Black; // Text Color
                    }

                    return true;
                };

                Control.ShouldEndEditing += (UITextView textView) =>
                {
                    if (textView.Text == "")
                    {
                        textView.Text = Placeholder;
                        textView.TextColor = UIColor.LightGray; // Placeholder Color
                    }

                    return true;
                };
            }
        }
    }
}

iOS(CustomeRenderer):

  _replyEditor = new PlaceholderEditor
  {
        Placeholder = "Placeholder Text"
  };

用法:

Select * from sampleTable where id = (select id from sampleTable where action = 'play' )

答案 1 :(得分:2)

下面是android

的代码
using System;
using MyApp;
using MyApp.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(CustomEditor), typeof(CustomEditorRenderer))]
namespace MyApp.Droid
{


    public class CustomEditorRenderer : EditorRenderer
    {
        public CustomEditorRenderer()
        {

        }

        protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
            {
                var element = e.NewElement as CustomEditor;
                this.Control.Hint = element.Placeholder;
                Control.Gravity = Android.Views.GravityFlags.Start;
                Control.SetBackgroundColor(global::Android.Graphics.Color.White);
                Control.SetPadding(15,15,15,15);
            }
        }

   }

答案 2 :(得分:1)

这是一个Xamarin表单版本,它允许将placehodler包含在Editor的初始化程序中,并且如果在代码中设置了Text属性,也可以处理一致的行为(即如果Editor.Text =&#34;&#34 ;它会以浅灰色显示占位符。

using System;
using Xamarin.Forms;
namespace CrowdWisdom.Controls
{
public class EditorPlaceHolder : Editor
{

    String placeHolderText = "";
    public EditorPlaceHolder(String placeholder)
    {
        Text = placeholder;
        TextColor = Color.LightGray;
        this.Focused += EditorPlaceHolder_Focused;
        this.Unfocused += EditorPlaceHolder_Unfocused;
        this.placeHolderText = placeholder;
    }

    private void EditorPlaceHolder_Focused(object sender, FocusEventArgs e) //triggered when the user taps on the Editor to interact with it
    {
        if (Empty())
        {
            base.Text = "";
            this.TextColor = Color.Black;
        }
    }

    private void EditorPlaceHolder_Unfocused(object sender, FocusEventArgs e) //triggered when the user taps "Done" or outside of the Editor to finish the editing
    {
        if (Empty()) //if there is text there, leave it, if the user erased everything, put the placeholder Text back and set the TextColor to gray
        {
            this.Text = placeHolderText;
            this.TextColor = Color.LightGray;
        }
    }

    public String PlaceHolderText
    {
        get
        {
            return this.placeHolderText;
        }
        set
        {
            if (this.Empty())
            {
                this.Text = value;
                this.TextColor = Color.LightGray;
            }
            this.placeHolderText = value;

        }
    }

    public bool Empty()
    {
        return (this.Text.Equals("") || this.Text.Equals(this.placeHolderText));
    }

    public virtual new string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            base.Text = value;
            if (Empty())
            {
                this.TextColor = Color.LightGray;
                base.Text = this.placeHolderText;
            }
            else
            {
                this.TextColor = Color.Black;
            }

        }

    }
}
}

答案 3 :(得分:0)

Xamarin Forms将占位符添加到Android的编辑器

using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;

namespace MyCare.Renderers
{
    class PlaceholderEditor : Editor
    {
        public static readonly BindableProperty PlaceholderProperty = BindableProperty.Create<PlaceholderEditor, string>(view => view.Placeholder, String.Empty);

        public PlaceholderEditor()
        {
        }

        public string Placeholder
        {
            get
            {
                return (string)GetValue(PlaceholderProperty);
            }

            set
            {
                SetValue(PlaceholderProperty, value);
            }
        }
    }
}

//Renderer
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
using MyCare.Renderers;
using MyCare.Droid.Renderers;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(PlaceholderEditor), typeof(PlaceholderEditorRenderer))]
namespace MyCare.Droid.Renderers
{
    class PlaceholderEditorRenderer : EditorRenderer
    {
        private string Placeholder { get; set; }

        protected override void OnElementChanged(ElementChangedEventArgs<Editor> e)
        {
            base.OnElementChanged(e);
            var element = this.Element as PlaceholderEditor;

            if (Control != null && element != null)
            {
                Placeholder = element.Placeholder;
                Control.SetTextColor(Android.Graphics.Color.Black);
                Control.SetHintTextColor(Android.Graphics.Color.LightGray);
                Control.Hint = element.Placeholder;
                Control.SetBackgroundColor(Android.Graphics.Color.Transparent);

            }
        }
    }
}

答案 4 :(得分:0)

继承Jay的解决方案。这是XAML中的用法

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:cstCtrl="clr-namespace:TeamCollaXform.Views"
         x:Class="TeamCollaXform.Views.MailComposePage">

...

<cstCtrl:PlaceholderEditor Grid.Row="2" x:Name="txtContent" Text="" HeightRequest="750" Placeholder="Compose..."/>