我有Xamarin.Forms前端应用程序和Web API .NET Core后端,我使用SignalR。我可以进行聊天-userA发送一条消息,所有连接的用户都可以看到它。
现在,我需要在userA单击按钮之后向所有连接的用户显示特定页面。我已经创建了DisplayPageToAllConnectedUsers SignalR客户端方法,但是我不知道如何告诉该页面向所有连接的用户显示特定页面。感谢您的任何建议
Xamarin.Forms-SignalRClient.cs
public class SignalRClient : INotifyPropertyChanged
{
private HubConnection Connection;
public delegate void MessageReceived(string username, string message);
public event MessageReceived OnMessageReceived;
public SignalRClient(string url)
{
Connection = new HubConnectionBuilder()
.WithUrl(url)
.Build();
Connection.On<string, string>("ReceiveMessage", (username, text) =>
{
OnMessageReceived?.Invoke(username, text);
});
Connection.On("DisplayPageToAllConnectedUsers", () =>
{
//??display specific page to all connected users??
});
}
public void SendMessage(string username, string text)
{
Connection.InvokeAsync("SendMessage", username, text);
}
public void DisplayPageToAllConnectedUsers()
{
Connection.InvokeAsync("DisplayPageToAllConnectedUsers");
}
public Task Start()
{
return Connection.StartAsync();
}
后端-ChatHub.cs
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
public async Task DisplayPageToAllConnectedUsers()
{
await Clients.All.SendAsync("DisplayPageToAllConnectedUsers");
}
}
我必须放置SignalRClient而不是MainPage,并且如果我使用MessagingCenter而不使用SignalR则它可以正常工作。参见波纹管
在SignalRClient.cs
public void DisplayPageToAllConnectedUsers()
{
//Connection.InvokeAsync("DisplayPageToAllConnectedUsers");
MessagingCenter.Send<SignalRClient>(this, "MyPage"); //working
}
但是一旦使用SignalR,它就无法正常工作
Connection.On("DisplayPageToAllConnectedUsers", () =>
{
MessagingCenter.Send<SignalRClient>(this, "MyPage");
});
答案 0 :(得分:0)
您可以使用MessagingCenter将消息发送到MainPage,将应用程序重定向到所需的任何页面。例如:
在SignalRClient.cs
MessagingCenter.Send<MainPage> (this, "ChangeToYourPage");
在MainPage.xaml.cs中,您预订此事件:
MessagingCenter.Subscribe<MainPage> (this, "ChangeToYourPage", (sender) => {
// do something whenever the "ChangeToYourPage" message is sent
Navigation.PushAsync(YourNewPage);
});