2017-05-23 5 views
0

私はいくつかのArduinoに接続して制御するソフトウェアを開発中です。今、Arduino(シリアルポート、ボーレート、ポート名など)のすべてのコードを処理するためのメソッドがあり、すべて正常に動作します。別のクラスからラベルを更新するC#Not working

ここに私の挑戦があります:自分のウィンドウにラベルがあり、そのソフトウェアが私のArduinoに接続されているときと切断されたときにそのラベルの内容を変更したいと思っています。私はコードを持っている、正しいと思われる、それは実行され、すべてが私のラベルを更新しません。私はさまざまな方法で試してみましたが、まだ動作しませんでしたので、私のラベルを更新するメソッドの1つでMessageBoxを作成し、ボタン(接続ボタン)が押されたときにそのメッセージボックスが表示されているので、私のラベルを更新すべき行なぜ、どのようなアイデアを私はそれを修正することができますか?

ArduinoControlコード:

using System; 
using System.IO.Ports; 

namespace MyApp 
{ 
    static class ArduinoControl 
    { 

     static SerialPort sp = new SerialPort(); 

     //Pentru conectarea la MainWindow; 
     static Arduino ard = new Arduino(); 

     public static bool isConnected = false;  


     public static void ConnectToArduino() 
     { 
      try 
      { 

       string portName = ard.tboxPortName.Text; 
       sp.PortName = portName; 
       sp.BaudRate = 9600; 
       sp.Open(); 
       ard.DisplayConnected(); 
       isConnected = true; 
      } 
      catch (Exception) 
      { 
       System.Windows.MessageBox.Show("Please give a valid port number or check your connection. " + 
        "If the port number is correct but the error persist, please check if your Arduino device is correctly connected."); 
      } 
     } 


     public static void DisconnectFromArduino() 
     { 
      try 
      { 
       sp.Close(); 
       isConnected = false; 
       ard.DisplayDisconnected(); 
      } 
      catch (Exception) 
      { 
       System.Windows.MessageBox.Show("In order to disconnect, you have to connect first to an Arduino device."); 
      } 
     } 


     //in work 
     public static bool IsConnected() 
     { 
      return isConnected; 
     } 
    } 
} 

私の窓からのクラスはここにある:

using System.Windows; 
using System.Windows.Media; 

namespace Xander 
{ 
    /// <summary> 
    /// Interaction logic for Arduino.xaml 
    /// </summary> 
    public partial class Arduino : Window 
    { 
     public Arduino() 
     { 
      InitializeComponent(); 
     } 


     //Butonul de conectare/deconectare la SerialPort pentru conexiunea la Arduino 
     private void btnConnect_Click(object sender, RoutedEventArgs e) 
     { 
      if (!ArduinoControl.IsConnected()) 
      { 
       ArduinoControl.ConnectToArduino(); 
      } 
      else 
      { 
       ArduinoControl.DisconnectFromArduino(); 
      } 
     } 

     //Butonul de ascundere a ferestrei ArduinoControl 
     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      Hide(); 
     } 

     //TODO - De verificat - NOT WORKING 
     public void DisplayConnected() 
     { 
      //MessageBox.Show("Metoda este rulata");   //WORKING 
      btnConnect.Content = "Disconnect"; 
      lblConnectionStatus.Foreground = Brushes.Green; 
      lblConnectionStatus.Content = "Connected"; 
     } 

     //TODO - De verificat - NOT WORKING 
     public void DisplayDisconnected() 
     { 
      btnConnect.Content = "Connect"; 
      lblConnectionStatus.Foreground = Brushes.Red; 
      lblConnectionStatus.Content = "Disconnected"; 
     } 
    } 
} 

任意のアイデア?

+0

あなたは、私はあなたがそれで何を意味するのか実現し、他のクラス –

+0

へのパラメータとしてラベルを渡す必要があります、私が試しましたそれは動作しませんでした。 –

+0

これは私にとってWPFコードのようです。 WinFormsのようなものなら、あなたの 'ArduinoControl'クラスは'新しいArduino(); 'フォームを作成しますが、決してそれを表示しません。私はあなたが既に画面上のフォームを参照しようとしていると推測しています。 – LarsTech

答えて

0

画面に表示されている既存のウィンドウインスタンスのメソッドを呼び出す必要があります。つまり、この特定のインスタンスへの参照を何とか取得する必要があります。

これを行う最も簡単な方法は、Application.Current.Windowsプロパティを使用することです:

public static void ConnectToArduino() 
{ 
    try 
    { 

     Arduino window = Application.Current.Windows.OfType<Arduino>().FirstOrDefault(); 
     string portName = window.tboxPortName.Text; 
     sp.PortName = portName; 
     sp.BaudRate = 9600; 
     sp.Open(); 
     window.DisplayConnected(); 
     isConnected = true; 
    } 
    catch (Exception) 
    { 
     System.Windows.MessageBox.Show("Please give a valid port number or check your connection. " + 
      "If the port number is correct but the error persist, please check if your Arduino device is correctly connected."); 
    } 
} 

public static void DisconnectFromArduino() 
{ 
    try 
    { 
     sp.Close(); 
     isConnected = false; 
     Arduino window = Application.Current.Windows.OfType<Arduino>().FirstOrDefault(); 
     window.DisplayDisconnected(); 
    } 
    catch (Exception) 
    { 
     System.Windows.MessageBox.Show("In order to disconnect, you have to connect first to an Arduino device."); 
    } 
} 
+0

これはうまくいきました。どうもありがとうございます。 –

関連する問題