如何在iOS中设置Xamarin.Forms搜索栏的样式?

时间:2014-06-24 15:39:36

标签: ios xamarin xamarin.forms

我试图设置Xamarin.Forms SearchBar的样式,我可以看到有一个BackgroundColor属性,但无论我设置什么,该属性在iOS中被忽略。

甚至可以在iOS中自定义Xamarin.Forms SearchBar(以及如何)?

2 个答案:

答案 0 :(得分:6)

不幸的是,我无法获得接受的工作答案。对于iOS,以下代码对我有用。请注意,OnElementChanged而不是Draw似乎是在自定义渲染器中放置此类东西的首选位置。

using MonoTouch.UIKit;

using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly:ExportRenderer( typeof(MyNamespace.MySearchBar), typeof(MyNamespace.iOS.MySearchBarRenderer_iOS))]


namespace MyNamespace.iOS
{
    public class MySearchBarRenderer_iOS : SearchBarRenderer
    {
        protected override void OnElementChanged( ElementChangedEventArgs<SearchBar> args )
        {
            base.OnElementChanged( args );

            UISearchBar bar = (UISearchBar)this.Control;

            bar.AutocapitalizationType = UITextAutocapitalizationType.None;
            bar.AutocorrectionType = UITextAutocorrectionType.No;
            bar.BarStyle = UIBarStyle.Default;
            bar.BarTintColor = UIColor.Green;
            bar.KeyboardType = UIKeyboardType.ASCIICapable;
        }
    }
}

答案 1 :(得分:4)

尽我所知,Xamarin.Forms没有属性实现BackgroundColor属性,或者它已被破坏。最接近真实背景颜色的UISearchBar属性是BarTint,它不是由XForms设置的。

为了解决这个问题,我把评论放在心上并用自定义渲染器创建了我自己的自定义SearchBar,以便扩展BarTint属性以及我想要的其他一些东西。

注意:要使用自定义渲染器,请确保更新为Xamarin.Forms 1.1.1.6206或更高版本。要更新平台版本,请使用Visual Studio中的NuGet或XamarinStudio中的内置包管理器。

您将需要两个类,第一个是CustomSearchBar,UI将用于保存自定义属性。它位于共享或可移植类库中。 :

using Xamarin.Forms;

namespace App1
{
    public class CustomSearchBar : SearchBar
    {
        // Use Bindable properties to maintain XAML binding compatibility

        public static readonly BindableProperty BarTintProperty = BindableProperty.Create<CustomSearchBar, Color?>(p => p.BarTint, null);
        public Color? BarTint
        {
            get { return (Color?)GetValue(BarTintProperty); }
            set { SetValue(BarTintProperty, value); }
        }

        public static readonly BindableProperty SearchStyleProperty = BindableProperty.Create<CustomSearchBar, string>(p => p.SearchStyle, "Default");
        public string SearchStyle
        {
            get { return (string)GetValue(SearchStyleProperty); }
            set { SetValue(SearchStyleProperty, value); }
        }

        public static readonly BindableProperty BarStyleProperty = BindableProperty.Create<CustomSearchBar, string>(p => p.BarStyle, "Default");
        public string BarStyle
        {
            get { return (string)GetValue(BarStyleProperty); }
            set { SetValue(BarStyleProperty, value); }
        }

    }
}

第二个类是自定义渲染器本身,它可以访问本机UISearchButton控件。这个课程在iOS项目中进行:

using System;
using System.Drawing;
using App1;
using App1.iOS;
using MonoTouch.UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;

[assembly: ExportRendererAttribute(typeof(CustomSearchBar), typeof(CustomSearchBarRenderer))]
namespace App1.iOS
{
    public class CustomSearchBarRenderer : SearchBarRenderer
    {
        // There might be a better place for this, but I don't know where it is
        public override void Draw(RectangleF rect)
        {
            var csb = (CustomSearchBar) Element;
            if (csb.BarTint != null)
                Control.BarTintColor = csb.BarTint.GetValueOrDefault().ToUIColor();
            Control.BarStyle = (UIBarStyle)Enum.Parse(typeof(UIBarStyle), csb.BarStyle);
            Control.SearchBarStyle = (UISearchBarStyle)Enum.Parse(typeof(UISearchBarStyle), csb.BarStyle);

            base.Draw(rect);
        }
    }
}

代码有点粗糙,但希望你能得到这个想法。

补充说明:

  • 如果没有ExportRendererAttribute,这些都不起作用,所以不要这样做 把它关掉。
  • 我必须使BarTint可以为空(因为它是 null为默认值,Color.Default为黑色)。
  • 我覆盖了Draw(),即使我在技术上没有绘制任何东西,因为我不知道在哪里放置代码。 Control和Element属性在构造函数中不可用。如果我找到更好的解决方案,我会尝试更新此示例。
  • 我使用字符串作为Enum属性,但将来可能会改进。