2017-04-07 5 views
1

Ich verwende SignalR, um ein Benachrichtigungssystem für den Informationsaustausch zwischen meinen Anwendungsinstanzen zu implementieren. Ich habe folgende Nabe Klasse:UI-Steuerelemente von einer anderen Klasse aktualisieren

[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); 
    } 
} 

Doch ich habe einig UI-Steuerelemente mit einem Etikett zu aktualisieren und zu einem Listenfeld zu protokollieren, was neue Informationen, die angekommen ist. Neben der Definition meiner Klasse in meinem Formularcode, wie kann ich das Form-Objekt aktualisieren, um diese neuen Informationen anzuzeigen, wenn ich meinen Hub in einer anderen Klasse definiert habe?

Antwort

0

Sie Sie können die öffentliche statische Eigenschaft in Ihrer Klasse Program oder die Klasse Form1 verwenden, um die Referenz dafür zu halten.

Zum Beispiel in Ihnen Program vor Application.Run(new Form1());

verwenden, können Sie dies tun:

public static Form1 MainForm { get; set; } 

und dann in der Main()

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

Von der Nabe können Sie jetzt bilden zugreifen:

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

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

Natürlich sollte das öffentlich sein. oder besser Sie stellen in Ihrer Form eine öffentliche Methode zur Verfügung, um mit ihr zu kommunizieren.

+0

Ich versuchte dieses erste und es funktioniert gut. Das Hauptproblem bestand darin, auf Formularsteuerelemente einer anderen Klasse zuzugreifen, die Sie in einer statischen Klasse definiert haben. Bedeutet das, wenn ich andere Objekte in einer anderen statischen Klasse definiere, kann ich auch auf sie zugreifen? – Medise

+0

Sie können dem Programm oder dem Formular mehr statische Elemente hinzufügen. Aber sei vorsichtig, dass du nicht zu statisch bist. Erstellen Sie eine sinnvolle Klassenhierarchie. Und erhalte den Zugang zu seiner Wurzel. –

1

Wenn Ihre App ist winform Sie auf die Nabe mit so etwas wie dies registrieren:

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(); 

Der Namespace HubProxy verwenden erforderlich ist Microsoft.AspNet.SignalR.Client

Dieses Beispiel herkommt: https://code.msdn.microsoft.com/windowsdesktop/Using-SignalR-in-WinForms-f1ec847b

+0

Ich denke, das OP spricht über den Server, nicht der Client –

Verwandte Themen