У меня есть приложение winform, которое мы используем дома. Он имеет много отдельных элементов управления на каждой из 25 «страниц» (usercontrols). Наша пользовательская база предпочитает очень технические приложения ... они хотят, чтобы TextBox был выделен синим цветом, если это обязательное поле (цвет должен исчезнуть, если введены данные). Они хотят, чтобы TextBox изменил цвет на зеленый, если в нем были изменены данные, чтобы напомнить им о необходимости сохранения. Они хотят, чтобы в данный момент выделенный текстовый блок был выделен RedOrange.
Я пытался прийти к этому с разных сторон (некоторые из вас, вероятно, видели подобные сообщения в последнее время). Ни один из них не работает ... Так что один из способов, которым я ЗНАЮ, будет работать, это зарегистрировать событие рисования для каждого элемента управления и проверить наличие «обязательного» тега для требуемой части. OnFocus для текущей части поля и, наконец, событие Validate для измененной части данных.
Я знаю, что это не лучший способ, или, по крайней мере, я НАСТОЯТЕЛЬНО подозреваю, что это не так, но у меня почти нет времени, и я близок к своему разочарованию. Это сказало, разрушит ли отзывчивость моего приложения? Есть ли способ лучше? Могу ли я переопределить базовый элемент управления для цвета в разных помещениях, чтобы мне не приходилось переходить к каждому из 100+ элементов управления?
Любая идея приветствуется, потому что я нахожусь между моей глупой идеей Paint_Event и переписываю все элементы управления в WPF ...:)
Я буду вознагражден решением, которое работает для меня и которое я вскоре смогу реализовать с помощью Bounty.
Мне так надоели цвета ...
Вот моя попытка, основанная на предложениях.
public class MyTextBox : TextBox
{
private bool _isRequired;
public bool isRequired
{
get
{
return _isRequired;
}
set
{
_isRequired = value;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
if (isRequired && base.Text.Equals(string.Empty))
{
HighlightControl(e.Graphics);
}
}
private void HighlightControl(Graphics graphics)
{
ControlPaint.DrawBorder(
graphics,
this.ClientRectangle,
Properties.Settings.Default.RequiredFieldColor,
Properties.Settings.Default.BorderWidth,
Properties.Settings.Default.BorderStyle,
Properties.Settings.Default.RequiredFieldColor,
Properties.Settings.Default.BorderWidth,
Properties.Settings.Default.BorderStyle,
Properties.Settings.Default.RequiredFieldColor,
Properties.Settings.Default.BorderWidth,
Properties.Settings.Default.BorderStyle,
Properties.Settings.Default.RequiredFieldColor,
Properties.Settings.Default.BorderWidth,
Properties.Settings.Default.BorderStyle);
}
}