#c# #xamarin #xamarin.forms
#c# #xamarin #xamarin.forms
Вопрос:
Итак, я выполняю некоторые проверки своих записей, и я хотел бы изменить цвет на красный, если значение недопустимо.
Есть ли способ сделать это в xamarin прямо сейчас?
Я знаю, что есть средство визуализации для постоянного изменения цвета, но я просто хочу изменить его на основе условия и оставить его черным, когда все в порядке.
Спасибо.
Комментарии:
1. Средство визуализации не обязательно должно делать это постоянно, его можно настроить для выполнения в определенных событиях. Если вы используете средство визуализации материалов и оно соответствует вашим требованиям, вы можете просто изменить цвет текста. В средстве визуализации визуальных материалов подчеркивание соответствует цвету текста.
Ответ №1:
Вы могли бы перезаписать OnElementPropertyChanged
метод в вашем CustomRenderer для достижения этой цели.
Например:
для Android:
[assembly: ExportRenderer(typeof(Entry), typeof(UnderLineEntry))]
namespace EntryCa.Droid
{
class UnderLineEntry : EntryRenderer
{
public UnderLineEntry(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control == null || e.NewElement == null) return;
Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.Black);
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == Entry.TextProperty.PropertyName)
{
if (Control.Text.Length > 6) //this is your condition(For example, here is the length of the text content)
{
Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.Red);
}
else
{
Control.BackgroundTintList = ColorStateList.ValueOf(Android.Graphics.Color.Black);
}
}
}
}
}
ios похожа на Android, также измените ее в OnElementPropertyChanged
методе, если хотите, я мог бы привести вам пример.
для ios.
[assembly: ExportRenderer(typeof(Entry), typeof(MyEntryRenderer))]
namespace EntryCa.iOS
{
public class MyEntryRenderer : EntryRenderer
{
private CALayer _line;
public override void LayoutSubviews()
{
base.LayoutSubviews();
Control.BorderStyle = UITextBorderStyle.None;
_line = new CALayer
{
BackgroundColor = UIColor.Black.CGColor,
Frame = new CGRect(0, Frame.Height, Frame.Width, 1f)
};
Control.Layer.AddSublayer(_line);
}
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == Entry.TextProperty.PropertyName)
{
if (Control.Text.Length > 6)
{
_line.RemoveFromSuperLayer();
_line = new CALayer
{
BackgroundColor = UIColor.Red.CGColor,
Frame = new CGRect(0, Frame.Height, Frame.Width, 1f)
};
Control.Layer.AddSublayer(_line);
}
else
{
_line.RemoveFromSuperLayer();
_line = new CALayer
{
BackgroundColor = UIColor.Black.CGColor,
Frame = new CGRect(0, Frame.Height, Frame.Width, 1f)
};
Control.Layer.AddSublayer(_line);
}
}
}
}
}
Комментарии:
1. Спасибо за ответ, смогу ли я использовать это, если я выполню свою проверку с помощью FluentValidation ? Потому что у меня есть некоторые проверки, сделанные в коде моего xaml, поэтому я буду работать, но остальные мои проверки выполняются в ViewModel, и я использую FluentValidaiton. Спасибо
2. Чжу Также, могу ли я получить версию этого для iOS, пожалуйста? Спасибо 🙂
3. @codetime хорошо, я дам вам коды для ios. (но я еще не тестировал это).
4. Хорошо, спасибо, вы знаете, есть ли способ сделать это так, как я объяснил в своем первом комментарии? Спасибо
5. Хорошо, потому что у меня есть некоторая проверка, которая также не выполнена в исходном коде (с плавной проверкой), поэтому нет способа изменить цвет строки, если проверка не выполнена в исходном коде, верно?
Ответ №2:
Чтобы изменить строку, необходимо использовать пользовательский рендерер, подобный этому.
Или просто скройте строку в пользовательском рендерере и подделайте строку на странице, тогда вы сможете управлять цветом с помощью триггера данных.
В качестве альтернативы, как насчет добавления рамки или изменения цвета фона вместо записи?
Комментарии:
1. он специально спросил о цвете подчеркивания, а не о цвете текста
2. Спасибо, Джейсон. Извините за мое чтение. Отредактировал ответ.