【问题标题】:How to hide clear button Icon inside SearchBar control Xamarin forms如何在 SearchBar 控件 Xamarin 表单中隐藏清除按钮图标
【发布时间】:2021-07-13 18:02:40
【问题描述】:

我正在使用 xamarin 表单 SearchBar 控件。我想在不使用自定义渲染器的情况下删除清除 button x 图标。

<controls:ExSearchBar
    x:Name="entrySearch"
    BackgroundColor="White"
    CornerRadius="6"                   
    BorderWidth="1"
    HeightRequest="45"
    Text="{Binding SearchText}"
    HorizontalOptions="FillAndExpand"
    Placeholder="search">
</controls:ExSearchBar>

这是共享项目中的ExSearchBar 控件

public class ExSearchBar : SearchBar
{
    public static readonly BindableProperty ElevationProperty = BindableProperty.Create(nameof(Elevation), typeof(float), typeof(ExFrame), default(float));

    public float Elevation
    {
        get { return (float)GetValue(ElevationProperty); }
        set { SetValue(ElevationProperty, value); }
    }
}

我该怎么做?

【问题讨论】:

标签: xamarin xamarin.forms


【解决方案1】:

您所描述的情况正是 Xamarin Forms 提供创建自定义呈现器功能的确切原因。表单团队以抽象的形式定义 UI 元素(与其原生实现分离),当他们的 API 中未定义特定功能时,您必须深入到平台级别进行更改。

您也可以使用Effect 来获得相同的结果,我为 iOS 和 Android 提供了一个自定义渲染器,向您展示如何实现您想要的 UI:

iOS:

public class SearchBarButtonRenderer : SearchBarRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            Control.SearchTextField.ClearButtonMode = UITextFieldViewMode.Never;
        }
    }
}

真的很简单,只需从底层UITextField移除清除按钮即可

安卓

public class SearchBarButtonRenderer : SearchBarRenderer
    {
        private readonly Context _context;

        public SearchBarButtonRenderer(Context context)
            : base(context)
        {
            _context = context;
        }

        protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
        {
            base.OnElementChanged(e);

            if (e.NewElement != null)
            {
                // Get Search Close Button Drawable
                var closeButtonId = Resources.GetIdentifier("android:id/search_close_btn", null, null);

                var searchEditText = Control.FindViewById<ImageView>(closeButtonId);

                // Get Close Button Drawable To Replace Existing Drawable
                var closeDrawable = GetCloseButtonDrawable() as VectorDrawable;

                if (closeDrawable is null) return;

                // Apply Transparent Color To Drawable (To Make Invisible)
                var buttonColor = Xamarin.Forms.Color.Transparent.ToAndroid();

                closeDrawable.SetTint(buttonColor);

                // Set Drawable On Control
                searchEditText.SetImageDrawable(closeDrawable);
            }
        }

        private Drawable GetCloseButtonDrawable()
        {
            return ContextCompat.GetDrawable(_context, Resource.Drawable.abc_ic_clear_material);
        }
    }

有点麻烦,找到可绘制的关闭按钮并将其替换为自定义样式的可绘制对象

【讨论】:

  • 我在问题中说过,我不需要自定义渲染器。好的np。 ExSearchbar 控件又是自定义控件。如何处理。
  • 您确实需要一个自定义渲染器,跨平台 API 中没有定义任何内容来授予您更改这些属性的能力。您需要在每个平台上实现此自定义 UI。我的代码单独显示了基本的自定义渲染器,您可以相应地更新您的渲染器?
  • 你应该写一下删除/禁用关闭按钮。我可以自己应用白色/透明色 xaml。
  • 在两个平台上都是这样吗?在 Android 上,CancelButtonColor 会影响 X 图标,但在 iOS 上不会。您可以使用 iOS 渲染器来实现这一点。
猜你喜欢
  • 1970-01-01
  • 2021-09-11
  • 2017-12-14
  • 2021-11-16
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多