#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);