Проблема с изменением цвета кнопки с помощью обработчика событий
В настоящее время я работаю над приложением Windows Mobile 6.5. Приложение имеет функцию Bluetooth, которая считывает данные с последовательного порта. После прочтения данных обработчик событий передает данные из класса более низкого уровня в представление пользовательского интерфейса. Пользовательский интерфейс обновит значение и изменит задний цвет кнопки в зависимости от значения, считанного с последовательного порта. Однако иногда устройство Bluetooth может быть вне зоны действия. Другими словами, портативное устройство не может получать данные от удаленного устройства Bluetooth.
Когда устройство находится в зоне действия и портативное устройство может получать данные от последовательного порта, полученное значение и задний цвет кнопки будут соответственно изменяться в пользовательском интерфейсе в зависимости от полученного значения. Однако после того, как устройство снова войдет в диапазон после выхода за пределы диапазона, обработчик событий по какой-то причине не работает, поэтому изменяется только значение, задний цвет кнопки не может измениться через обработчик событий.
Если я нажму на эту кнопку, цвет снова изменится. Похоже, что цвет будет меняться только если фокус находится на кнопке. Я могу подтвердить, что проблема, связанная с обработчиком событий, потому что я напечатал deviceName на метке, обработчик событий не запускается. Может кто-нибудь знает, почему это происходит? или любую лучшую идею подойти.
Вот код, который я использую для отслеживания изменения цвета кнопки и ее обработчика событий:
Button[] gauges = new Button[MonitoringGauges.Count()]; // declare the button variable
// Create a button for each gauge
.....
.....
.....
// Constructor
for(int k = MonitoringGauges.count -1 ; k >=0 ; k--){ // keep listening to the backcolor change for the button corresponding to the gauge
if(MonitoringGauges[k] !=null){
MonitoringGauges[k].TrainingZoneChanged += new Gauge.TrainingZoneChangedEventHandler(x_TrainingZoneChanged);
}
}
// event handler
void x_TrainingZoneChanged(string deviceName, string macAddress, Color color){
if(!string.IsNullOrEmpty(deviceName) && !string.IsNullOrEmpty(macAddress) && color !=null){
Button btn = gauges.Where(x =>x.Name.equals(deviceName)).First(); // find the correct button for updating the backcolor of the button
if(btn !=null){
btn.Invoke((Action) delegate
{
if(color == Color.Black){
btn.BackColor = Color.LightBlue;
} else{
btn.BackColor = color;
}
});
}
}
}
Спасибо за любую помощь.
С Уважением,
SW Lau
1 ответ
Вы уже пробовали простой btn.Refresh() для принудительного перерисовки? Возможно, за ним следует Application.DoEvents();