2017-04-07 57 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

你可以使用公共靜態屬性Program類或Form1類來保存它的引用。

例如,在您Program使用Application.Run(new Form1());

之前,你可以這樣做:

public static Form1 MainForm { get; set; } 

然後在Main()

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

從集線器,您可以訪問你現在形成:

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

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

當然,那lstMessages應該是公開的。或者更好地在你的表單中公開一些公開的方法來與它進行交流。

+0

我先試了這個,它工作正常。主要的問題是從另一個類訪問表單控件,這是您在靜態類中幫助定義的。這是否意味着如果我在其他靜態類中定義其他對象,我也可以訪問它們? – Medise

+0

您可以將更多靜態成員添加到本程序或表單。但要注意避免過於靜態。建立合理的班級結構。並獲得它的根。 –

1

如果您的應用的WinForm你可以像這樣的輪轂註冊:

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

這個例子來自:https://code.msdn.microsoft.com/windowsdesktop/Using-SignalR-in-WinForms-f1ec847b

+0

我認爲OP是在談論服務器,而不是客戶端 –