2012-06-28 53 views
0

我目前正在使用Windows Mobile 6.5應用程序。該應用程序具有從串口讀取數據的藍牙功能。一旦數據被讀取,事件處理程序會將數據從較低級別的類傳遞到UI視圖。 UI將根據從串口讀取的值更新該值並更改按鈕的背景顏色。但是,有時,藍牙設備可能超出範圍。換句話說,手持設備不能從遠程藍牙設備接收任何數據。使用事件處理程序更改按鈕背景問題

當設備在距離範圍內且手持設備可以從串口接收數據時,根據收到的值,接收到的數值和背景顏色會在UI中相應變化。但是,當設備在超出範圍後再次進入範圍後,事件處理程序由於某種原因而不起作用,因此只有值發生更改,按鈕的背景顏色才能通過事件處理程序更改。

如果我點擊那個按鈕,顏色會再次改變。它看起來只有當焦點在按鈕上時顏色纔會改變。我可以確認與事件處理程序有關的問題,因爲我在標籤上打印了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劉

+0

你是說事件處理程序沒有觸發,或者你說btn.BackColor的調用沒有任何明顯的效果? – ctacke

+0

設備在超出範圍後再次進入範圍後,背景顏色沒有明顯的效果 –

+0

因此,您在該行上放置了一個斷點,並驗證該行代碼正在執行,是否正確? – ctacke

回答

0

你已經嘗試一個簡單的btn.Refresh()執行重繪?可能後面跟着一個Application.DoEvents();

+0

嗨,約瑟夫,我已經嘗試btn.Refresh()本身,沒有任何成功。你的意思是在btn.Refresh()之後添加Application.Doevents(); –

+0

嗨,理由是超出範圍後,用戶界面凍結了一段時間,然後再回來,以便事件處理程序不起作用? –

+0

嗨 是的,我的意思是在btn.Refresh()之後添加一個Application.DoEvents()。 您的事件處理程序顏色代碼是否曾被調用?您是否在事件處理程序的第一行中放置了斷點(「if(!string.IsNullOrEmpty(deviceName)&& ...)?我由後臺線程觸發了事件處理程序嗎? – josef