2016-05-10 14 views
0

私は問題がありました: 別のスレッドからラベル内のフォントの色を更新しようとしましたが、失敗してしまいました。WinFormsラベルのフォアカラー更新

private Color defaultBgColor = Color.Red; 
    private Color passOkBgColor = Color.LightGreen; 

    private Color defaultForeColor = Color.FromArgb(255, 255, 255, 255); 
    private Color passOkForeColor = Color.FromArgb(255, 0, 0, 255); 

私の機能があります:

private void Func() { 
     try { 
      if (pipeReader != null) { 
       string msg_strg = String.Empty; 
       while(true) { 
        if (!npsc.IsConnected) { 
         npsc.Connect(); 
         Thread.Sleep(500); 
         continue; 
        } 

        while ((msg_strg = pipeReader.ReadLine()) != null) {      ; 
         statusLabel.BeginInvoke((MethodInvoker)(() => { 
                    if (statusesDict.ContainsKey(msg_strg)) 
                     statusLabel.Text = statusesDict[msg_strg]; 
                    else 
                     statusLabel.Text = "!UNKNOWN STATUS!"; 

                    if (msg_strg != "CARDREADER_USER_EXISTS") { 
                     this.BackColor = defaultBgColor; 
                     statusLabel.ForeColor = defaultForeColor; 
                    } else { 
                     this.BackColor = passOkBgColor; 
                     statusLabel.ForeColor = passOkForeColor; 
                    } 
                   })); 
         statusLabel.Refresh(); 
         Thread.Sleep(300); 
        } 
       } 
      } 
     } catch (Exception ex) { 
      Log.Instance.Error("Exception: "+ex.Message); 
     } 
    } 

どのように私はこの問題を解決する必要がありますか?

+3

* ...しかし、それが失敗した*あなたはより具体的だろうか? –

+1

'statusLabel.Refresh();'も呼び出されるべきではありませんか? – ASh

答えて

1

コードには少なくとも2つの問題があります。

まず、statusLabel.RefreshコールはBeginInvokeブロック内にある必要があります。

ブロックは、ブロック実行時に変更された可能性があるキャプチャされた変数msg_strgを使用しています。

試してみて、あなたの問題が(それが何であれ)に解決されるかどうかを確認し、上記の問題を解決すれば、以下の通り:

private void Func() { 
    try { 
     if (pipeReader != null) { 
      Action<string> updateStatus = message => 
      { 
       if (statusesDict.ContainsKey(message)) 
        statusLabel.Text = statusesDict[message]; 
       else 
        statusLabel.Text = "!UNKNOWN STATUS!"; 

       if (message != "CARDREADER_USER_EXISTS") { 
        this.BackColor = defaultBgColor; 
        statusLabel.ForeColor = defaultForeColor; 
       } else { 
        this.BackColor = passOkBgColor; 
        statusLabel.ForeColor = passOkForeColor; 
       } 

       statusLabel.Refresh(); 
      }; 


      while(true) { 
       if (!npsc.IsConnected) { 
        npsc.Connect(); 
        Thread.Sleep(500); 
        continue; 
       } 

       string msg_str; 
       while ((msg_strg = pipeReader.ReadLine()) != null) { 
        statusLabel.BeginInvoke(updateStatus, msg_str); 
        Thread.Sleep(300); 
       } 
      } 
     } 
    } catch (Exception ex) { 
     Log.Instance.Error("Exception: " + ex.Message); 
    } 
} 
+0

イワン、訂正ありがとう!しかし、私はこの問題を解決しました。実際には、私は注意を払わなかった、そのstatusLabel.Enabledは偽でした。私はそれをTRUEに変更しました。この問題は解決されました! –

関連する問題