Ввод текста цветом

#c# #uwp #xamarin.forms

#c# #uwp #xamarin.forms

Вопрос:

У меня есть это CustomEntry в части PCL:

 public class CustomEntry : Entry
{
    /// <summary>
    /// The HasBorder property.
    /// </summary>
    public static readonly BindableProperty HasBorderProperty =
        BindableProperty.Create(nameof(HasBorder), typeof(bool), typeof(CustomEntry), true);

    /// <summary>
    /// Assessor for the HasBorder property.
    /// </summary>
    public bool HasBorder
    {
        get { return (bool)GetValue(HasBorderProperty); }
        set { SetValue(HasBorderProperty, value); }
    }

    /// <summary>
    /// The XAlign property
    /// </summary>
    public static readonly BindableProperty XAlignProperty =
        BindableProperty.Create("XAlign", typeof(TextAlignment), typeof(CustomEntry),
        TextAlignment.Start);

    /// <summary>
    /// Gets or sets the X alignment of the text
    /// </summary>
    public TextAlignment XAlign
    {
        get { return (TextAlignment)GetValue(XAlignProperty); }
        set { SetValue(XAlignProperty, value); }
    }
}
 

Затем средство визуализации для части UWP:

 public class CustomEntryRenderer : EntryRenderer
{
    /// <summary>
    /// Instance of our Custom control declared in the PCL part.
    /// </summary>
    CustomEntry customEntry;

    /// <summary>
    /// We override the OnElementChanged() event handler to get the desired instance. We also use it for updates.
    /// </summary>
    /// <param name="e">It contains either the NewElement or the OldElement.</param>
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            customEntry = e.NewElement as CustomEntry;

            if (customEntry != null)
            {
                SetTextAlignment();
                SetBorderPresence();
                SetTextColor();
            }
        }
    }


    /// <summary>
    /// The on element property changed callback.
    /// </summary>
    /// <param name="sender">The sender.</param>
    /// <param name="e">The <see cref="PropertyChangedEventArgs"/>Instance containing the event data.</param>
    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == CustomEntry.XAlignProperty.PropertyName)
            SetTextAlignment();
        else if (e.PropertyName == CustomEntry.HasBorderProperty.PropertyName)
            SetBorderPresence();
        else if (e.PropertyName == CustomEntry.TextColorProperty.PropertyName)
            SetTextColor();
    }

    /// <summary>
    /// Sets the text alignment.
    /// </summary>
    /// <param name="view">The view.</param>
    private void SetTextAlignment()
    {
        switch (customEntry.XAlign)
        {
            case Xamarin.Forms.TextAlignment.Center:
                Control.TextAlignment = Windows.UI.Xaml.TextAlignment.Center;
                break;
            case Xamarin.Forms.TextAlignment.End:
                Control.TextAlignment = Windows.UI.Xaml.TextAlignment.Right;
                break;
            case Xamarin.Forms.TextAlignment.Start:
                Control.TextAlignment = Windows.UI.Xaml.TextAlignment.Left;
                break;
        }
    }

    /// <summary>
    /// Sets the border presence.
    /// </summary>
    private void SetBorderPresence()
    {
        if (!customEntry.HasBorder)
        {
            Control.BorderThickness = new Windows.UI.Xaml.Thickness();
        }
    }

    /// <summary>
    /// Set the Text color.
    /// </summary>
    private void SetTextColor()
    {
        /*Control.ForegroundFocusBrush = new SolidColorBrush(Windows.UI.Color.FromArgb(255,
            Convert.ToByte(customEntry.TextColor.R),
            Convert.ToByte(customEntry.TextColor.G),
            Convert.ToByte(customEntry.TextColor.B)));

        Brush tmp = (SolidColorBrush)new ColorConverter().Convert(customEntry.TextColor, null, null, null);

        Control.ForegroundFocusBrush = (SolidColorBrush)new ColorConverter().Convert(customEntry.TextColor, null, null, null);
        Debug.WriteLine("Pass");*/
    }
}
 

Дело в том, что когда я печатаю, цвет текста черный, это означает, что я не думаю, что я печатаю, потому что он черный поверх темного дизайна.. Кто-нибудь знает, как изменить цвет набора текста? Потому что, когда я расфокусирую de Entry , текст становится белым, как я этого хочу..

Существует объявление XAML:

         <AbsoluteLayout WidthRequest="{Binding EntryWidth}" HeightRequest="{Binding EntryHeight}">
          <control:CustomEntry Placeholder="pseudo" PlaceholderColor="Gray"
                               Text="" FontFamily="{extension:FontFamily Roboto_Light}" FontSize="20" TextColor="White"
                               XAlign="Center" HasBorder="false" BackgroundColor="Transparent"
                               AbsoluteLayout.LayoutBounds="0.5, 0.5, 1, 1"
                               AbsoluteLayout.LayoutFlags="All"/>
          <BoxView BackgroundColor="{StaticResource NL_OrangeBeer}"
                   AbsoluteLayout.LayoutBounds="0.5, 0.7, 0.8, 0.02"
                   AbsoluteLayout.LayoutFlags="All"/>
        </AbsoluteLayout>
 

Ответ №1:

Я не знаю, решили ли вы это, но недавно у меня была точно такая же проблема.

Итак, в вашем пользовательском средстве визуализации есть свойство элемента управления с именем ForegroundFocusBrush, которое задает цвет при фокусировке.

Просто сделайте это в переопределении OnElementChanged,

Например, чтобы установить сфокусированный цвет на белый

 Control.ForegroundFocusBrush = new SolidColorBrush(Colors.White);