从另一个类更新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
应该是公开的。或者更好地在你的表单中公开一些公开的方法来与它进行交流。
答
如果您的应用的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是在谈论服务器,而不是客户端 –
我先试了这个,它工作正常。主要的问题是从另一个类访问表单控件,这是您在静态类中帮助定义的。这是否意味着如果我在其他静态类中定义其他对象,我也可以访问它们? – Medise
您可以将更多静态成员添加到本程序或表单。但要注意避免过于静态。建立合理的班级结构。并获得它的根。 –