2017-04-07 16 views
1

SignalRを使用して、アプリケーションインスタンス間で情報を交換する通知システムを実装しています。私は、次のハブのクラスを持っている:まだ別のクラスからUIコントロールを更新する

[HubName("OpenHub")] 
public class OpenHub:Hub 
{ 
    public void DetermineLength(string message) 
    { 
     Clients.All.RecieveNewInfo(newMessage); 
     //How to use something like the following line? 
     //concerning that Form1 is loaded at application startup 
     //and I should not create a new instance 
     //Form1.lstMessages.Add(newMessage); 
    } 
} 

、私はラベルと到着したその新しいな情報をログに記録するリストボックスを含むいくつかのUIコントロールを更新する必要があります。フォームのコードに自分のクラスを定義するだけでなく、別のクラスでハブを定義したときに、これらの新しい情報を表示するためにFormオブジェクトを更新するにはどうすればよいですか?

答えて

0

var Connection = new HubConnection("yourSignalRServerUrl");  
var HubProxy = Connection.CreateHubProxy("OpenHub"); 

HubProxy.On<string>("RecieveNewInfo", (message) => 
    this.Invoke((Action)(() => 
     Form1.lstMessages.Add(message); 
); 

await Connection.Start(); 

HubProxyを使用するために必要な名前空間Microsoft.AspNet.SignalR.Client

この例では、から来ていますProgramクラスのpublic staticプロパティを使用するか、またはその参照を保持するクラスForm1を使用できます。

public static Form1 MainForm { get; set; } 

、その後、ハブからMain()

MainForm = new Form1(); 
Application.Run(MainForm); 

にあなたはあなたが今形成アクセスすることができます:あなたはこれを行うことができApplication.Run(new Form1());

を使用する前に、あなたの中に例えば

Program

[HubName("OpenHub")] 
public class OpenHub:Hub 
{ 
    public void DetermineLength(string message) 
    { 
     Clients.All.RecieveNewInfo(newMessage); 

     Program.MainForm.lstMessages.Add(newMessage); 
    } 
} 

もちろん、lstMessagesは公開する必要があります。またはあなたのフォームでそれを使ってコミュニケーションするための公開方法を公開してください。

+0

私はこの1つを最初に試してみました。主な問題は、静的クラスで定義するのを手助けした別のクラスからフォームコントロールにアクセスすることでした。別の静的クラスに他のオブジェクトを定義しても、そのクラスにもアクセスできますか? – Medise

+0

プログラムまたはフォームに静的メンバーを追加することができます。しかし静かに過ぎないように注意してください。賢明なクラス階層を構築する。そして、そのルートへのアクセスを取得します。 –

関連する問題