Проблема с изменением цвета кнопки с помощью обработчика событий

В настоящее время я работаю над приложением 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();

Другие вопросы по тегам