TextColor Xamarin.Forms SearchBar

У меня есть панель поиска Xamarin.Forms на StackLayout с темным фоновым цветом.

По умолчанию поле ввода также темное, вероятно, из-за прозрачного фона. Для изменения цвета фона панели поиска есть BackgroundColor имущество. (В приведенном ниже примере я установил его на темно-серый.)

Но как настроить цвет текста? Там нет такой собственности. И даже с пользовательским рендерером панели поиска я не нахожу решения.

Вот как это выглядит только с заполнителем:

... и с некоторой информацией (черный "Hello world!" на довольно темном фоне):

6 ответов

Решение

Вы можете достичь этого, создав пользовательское представление, имеющее свойство bindable, например ForegroundTextColor, а затем создайте пользовательское средство визуализации.

В пользовательском рендерере вы можете наследовать от конкретного рендерера платформы, т.е. на WindowsPhone это: -

Xamarin.Forms.Platform.WinPhone.SearchBarRenderer

Затем вы можете отслеживать изменения свойств созданного bindable-свойства и устанавливать собственный элемент управления платформы Text-color, который используется для изменения внешнего вида нередактируемого представления панели поиска.

Вы также должны следить за IsFocused и применять раскраску на WindowsPhone, по крайней мере, также. Это может также относиться и к другим платформам.

Обновление 1: -

========

В ответ на ваш комментарий вам не нужно визуализировать весь SearchBar самостоятельно.

Если вы наследуете от рендерера, вы можете настроить вещи лучше.

С конкретной ссылкой на Android, чтобы добиться этого, вы должны получить ссылку на AutoCompleteTextView, а затем вы можете вызвать SetTextColor, чтобы изменить цвет.

Обновление 2: -

==========

SearchBar представляет собой составной элемент управления в Android.

AutoCompleteTextView похоронен довольно глубоко в иерархии.

На 4.4 это можно найти с помощью следующего кода. Другие версии могут отличаться. Однако это ни в коем случае не является хорошим подходом для производства с использованием порядковых индексов:

AutoCompleteTextView objAutoTextView = (AutoCompleteTextView)(((this.Control.GetChildAt(0) as ViewGroup).GetChildAt(2) as ViewGroup).GetChildAt(1) as ViewGroup).GetChildAt(0);

Где это класс рендерера.

Затем можно вызвать objAutoTextView.SetTextColor с цветом, чтобы добиться изменения цвета текста переднего плана SearchBar.

Вот код для Android Custom Renderer, который сделает свое дело. Я бы загрузил скриншот, но мне пока не хватает очков:(

using System;

using Android.Widget;
using Android.Text;
using G = Android.Graphics;

using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly:ExportRenderer( typeof(MySearchBar), typeof(Some.Namespance.MySearchBar_Droid) )]

namespace Some.Namespace
{
    public class MySearchBar_Droid : SearchBarRenderer
    {
        protected override void OnElementChanged( ElementChangedEventArgs<SearchBar> args )
        {
            base.OnElementChanged( args );

            // Get native control (background set in shared code, but can use SetBackgroundColor here)
            SearchView searchView = (base.Control as SearchView);
            searchView.SetInputType( InputTypes.ClassText | InputTypes.TextVariationNormal );

            // Access search textview within control
            int textViewId = searchView.Context.Resources.GetIdentifier( "android:id/search_src_text", null, null );
            EditText textView = (searchView.FindViewById( textViewId ) as EditText);

            // Set custom colors
            textView.SetBackgroundColor( G.Color.Rgb( 225, 225, 225 ) );
            textView.SetTextColor( G.Color.Rgb( 32, 32, 32 ) );
            textView.SetHintTextColor( G.Color.Rgb( 128, 128, 128 ) );

            // Customize frame color
            int frameId = searchView.Context.Resources.GetIdentifier( "android:id/search_plate", null, null );
            Android.Views.View frameView = (searchView.FindViewById( frameId ) as Android.Views.View);
            frameView.SetBackgroundColor( G.Color.Rgb( 96, 96, 96 ) );
        }
    }
}

Я наконец нашел очень простое решение:

Я случайно использовал Android Theme @android:style/Theme.Holo.Light и явно изменил все цвета. Но чтобы получить яркий цвет текста в строке поиска, лучше использовать @android:style/Theme.Holo,

Он не позволяет вам очень точно установить цвет, но все, что мне нужно в этом случае, - это изменить его с черного на белый.

Вы можете внести следующие изменения в xaml, если вы используете xaml для получения разного цвета текста панели поиска на разных платформах:

<SearchBar x:Name="Search"
           Placeholder="Search"    
           TextChanged="SearchBar_OnTextChanged"  
           SearchButtonPressed="OnSearch" BackgroundColor="#19588F">
         <SearchBar.TextColor>
             <OnPlatform x:TypeArguments="Color">
                    <OnPlatform.iOS>
                      Black
                    </OnPlatform.iOS>
                    <OnPlatform.Android>
                      White
                    </OnPlatform.Android>
                    <OnPlatform.WinPhone>
                      White
                    </OnPlatform.WinPhone>
             </OnPlatform>
         </SearchBar.TextColor>
 </SearchBar> 

Вот как я это сделал, по-другому:

[assembly: ExportRenderer(typeof (CustomSearchBar), typeof (CustomSearchBarRenderer))]

namespace Bahai.Android.Renderers 
{
public class CustomSearchBarRenderer : SearchBarRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<SearchBar> e)
    {
        base.OnElementChanged(e);
        if (e.OldElement == null)
        {
            SearchBar element = (SearchBar) this.Element;
            var native = (global::Android.Widget.SearchView) Control;

            // do whatever you want to the controls here!
            //--------------------------------------------
            // element.BackgroundColor = Color.Transparent;
            // native.SetBackgroundColor(element.BackgroundColor.ToAndroid());
            // native.SetBackgroundColor(Color.White.ToAndroid());

            //The text color of the SearchBar / SearchView 
            AutoCompleteTextView textField = (AutoCompleteTextView)
                (((Control.GetChildAt(0) as ViewGroup)
                    .GetChildAt(2) as ViewGroup)
                    .GetChildAt(1) as ViewGroup)
                    .GetChildAt(0);

            if (textField != null)
                textField.SetTextColor(Color.White.ToAndroid());
        }
    }
   }
}

SearchBar имеет свойство TextColor. По крайней мере, в Xamarin 5.

      <SearchBar
        TextColor="Black"
        Text="{Binding SearchString}">
Другие вопросы по тегам