0

私は現在、Windows Mobile 6.5 アプリケーションに取り組んでいます。アプリケーションには、シリアル ポートからデータを読み取る Bluetooth 機能があります。データが読み取られると、イベント ハンドラーは下位レベル クラスから UI ビューにデータを渡します。UI は値を更新し、シリアル ポートから読み取った値に応じてボタンの背景色を変更します。ただし、場合によっては、Bluetooth デバイスが範囲外になることがあります。つまり、ハンドヘルド デバイスは、リモートの Bluetooth デバイスからデータを受信できません。

デバイスが範囲内にあり、ハンドヘルド デバイスがシリアル ポートからデータを受信できる場合、受信した値とボタンの背景色は、受信した値に応じて 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 ラウ

4

1 に答える 1

0

単純な btn.Refresh() を試して再描画を強制しましたか? おそらくその後に Application.DoEvents(); が続きます。

于 2012-06-29T09:45:52.980 に答える