2016-08-10 13 views
0

サーバーとMainWindow:Windowクラスの2つのクラスがあります。私がしたいのは、Data_Received()メソッドを呼び出すと接続があったという私のWPFショーを持っているだけです。それはかなり単純ですが、変数ラベルの確認にもかかわらず、GUI上に変更が表示されていません。内容が変化しています。私のサーバ・クラスでlabel.Contentを更新できますが、ウィンドウに変更が反映されません。

public static void ClientHandler(object obj)      // Setup a NetworkStream for the client and a MemoryStream to write to 
    { 

     TcpClient client = (TcpClient)obj;        //Maps the "obj" arg to a TcpClient 
     NetworkStream netStream = client.GetStream(); 
     BinaryWriter binWriter = new BinaryWriter(netStream); 
     OkResponse(binWriter); 
     MainWindow window = new MainWindow(); 
     window.Data_Received("CONNECTION RECEIVED"); 

... 

私のWindowクラス

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public void Data_Received(string message) 
    { 
     label.Content = message;   
    } 

} 

私はできます。Console.WriteLine(lable.Content)では、それを「メッセージ」で更新する前と後で、実際には変更されます。しかし、GUI上では変更はありません。

+4

。しかし、あなたはその窓を決して見せません。すでに存在するウィンドウインスタンスのメソッドを呼び出すことは確かです。 – Clemens

+0

どのように2つのクラスが接続されていますか? MainWindowにサーバークラスのインスタンスがありますか? –

答えて

1

インスタンスの誤解があると思います。

public static void ClientHandler(object obj)の方法でサーバークラスに作成するウィンドウは、ラベルテキストが表示されるウィンドウと同じウィンドウではありません。

ライン:あなたはnewキーワードを使用しているため

MainWindow window = new MainWindow(); 
window.Data_Received("CONNECTION RECEIVED"); 

が異なる/新しいインスタンスを作成します。 あなたの必要なものは、あなたのMainWindowの実際のインスタンスです!

MainWindowクラス内にサーバークラスのインスタンスがある場合は、 というイベントをサーバークラスに作成し、MainWindowクラスに登録することができます。そのイベントを起こしてメッセージを渡す。

1

おそらく、あなたのClientHandlerメソッドは他のスレッドから呼び出してからメインウィンドウのスレッドを呼び出すでしょう。その場合は、バグを確認します( "unupdateble"ラベルから例外が発生するまで)。それを修正するには、メインウィンドウのスレッドにラベルを更新するよりも、コードを接続する必要があります:あなたはData_Receivedメソッドを呼び出す*新しい*メインウィンドウのインスタンスを、作成している

public static void ClientHandler(object obj) 
{ 

    TcpClient client = (TcpClient)obj;        //Maps the "obj" arg to a TcpClient 
    NetworkStream netStream = client.GetStream(); 
    BinaryWriter binWriter = new BinaryWriter(netStream); 
    OkResponse(binWriter); 
    //MainWindow window = new MainWindow(); 
    //MainWindow window MUST be created and showed already 
    //and we MUST use here that instance 
    window.Dispatcher.Invoke(()=> window.Data_Received("CONNECTION RECEIVED")); 
関連する問題