从另一个类更新UI控件

问题描述:

我正在使用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对象以显示这些新信息?

你可以使用公共静态属性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

您可以将更多静态成员添加到本程序或表单。但要注意避免过于静态。建立合理的班级结构。并获得它的根。 –

如果您的应用的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是在谈论服务器,而不是客户端 –