如何实现两个本地 Silverlight 应用程序之间的通信?






4.96/5 (43投票s)
实现两个本地 Silverlight 应用程序之间的通信
引言
有时,需要在两个本地Silverlight应用程序之间进行通信。 虽然这种情况非常有限,但根据您的业务需求,它可能是必需的。 在这种情况下,本地消息传递机制就派上用场了。
在本文中,我们将学习这个本地消息传递系统,使用一个小的Silverlight应用程序,其中我们将有一个发送项目和一个接收项目。 在文章的最后,我嵌入了一个演示,这将使您更清楚地了解我们将在演示中做什么。 让我们更多地讨论这个话题。
创建项目结构
让我们从为我们的示例演示应用程序创建项目结构开始。 在这个演示中,我们将创建两个不同的Silverlight项目,分别称为“Sender
”和“Receiver
”。 Sender
项目将广播一些消息,接收者将捕获该消息并根据该消息执行下一个操作。
这是供您参考的项目结构

创建发送者UI
让我们创建发送者应用程序的UI。 在这里,我们将有几个单选按钮用于选择不同的颜色,以及一个按钮,使用户能够提交要广播的消息。 这是XAML代码
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel>
<RadioButton x:Name="rdoRed" GroupName="color" Content="Red"/>
<RadioButton x:Name="rdoGreen" GroupName="color" Content="Green"/>
<RadioButton x:Name="rdoBlue" GroupName="color" Content="Blue"/>
<RadioButton x:Name="rdoYellow" GroupName="color" Content="Yellow"/>
<Button Content="Send" Height="26" Width="150" Click="SendButtonClick"/>
</StackPanel>
</Grid>
这将在UI中呈现如下

实现消息广播
现在是将消息发送到接收者应用程序的时候了。为此,有一个名为LocalMessageSender
的类,它位于“System.Windows.Messaging
”命名空间下,它将接收者名称和接收者域作为构造函数参数
public LocalMessageSender(string receiverName, string receiverDomain);
在按钮点击事件中,我们将检查选择了哪种颜色,然后我们将创建LocalMessageSender
类的实例,并将适当的颜色作为消息传递给SendAsync()
方法,如下所示
private void SendButtonClick(object sender, RoutedEventArgs e)
{
var rdoRedSelected = rdoRed.IsChecked == true;
var rdoGreenSelected = rdoGreen.IsChecked == true;
var rdoBlueSelected = rdoBlue.IsChecked == true;
var rdoYellowSelected = rdoYellow.IsChecked == true;
var localMessageSender = new LocalMessageSender("myMessagingDemo",
LocalMessageSender.Global);
localMessageSender.SendAsync(rdoRedSelected ? "Red"
: rdoGreenSelected ? "Green"
: rdoBlueSelected ? "Blue"
: rdoYellowSelected ? "Yellow"
: "White");
}
它具有SendAsync()
方法的已完成事件(SendCompleted
),您可以在其中检查ReceiverName
,ReceiverDomain
,Message
和Response
(如果有)。
消息接收的实现
与LocalMessageSender
类似,我们还有另一个名为LocalMessageReceiver
的类,它位于同一个命名空间“System.Windows.Messaging
”中。 它将接收者名称,接收者的名称范围和允许的发送者域作为构造函数参数,如下所示
public LocalMessageReceiver(string receiverName,
ReceiverNameScope nameScope,
IEnumerable<string> allowedSenderDomains);
在接收者项目的页面加载事件中,我们将创建LocalMessageReceiver
的实例,注册MessageReceived
事件,然后调用Listen()
方法以开始侦听消息。
void MainPageLoaded(object sender, RoutedEventArgs e)
{
var localMessageReceiver = new LocalMessageReceiver("myMessagingDemo",
ReceiverNameScope.Global,
LocalMessageReceiver.AnyDomain);
localMessageReceiver.MessageReceived += LocalMessageReceiverMessageReceived;
localMessageReceiver.Listen();
}
在消息接收事件的实现中,我们将检查消息的类型,并根据收到的消息,我们将执行适当的操作。 在我们的例子中,根据我们收到的颜色信息,我们将更改接收者应用程序的LayoutRoot
网格的背景颜色。
这是相同的实现
void LocalMessageReceiverMessageReceived(object sender, MessageReceivedEventArgs e)
{
var message = e.Message;
switch (message)
{
case "Red":
LayoutRoot.Background = new SolidColorBrush(Colors.Red);
break;
case "Green":
LayoutRoot.Background = new SolidColorBrush(Colors.Green);
break;
case "Blue":
LayoutRoot.Background = new SolidColorBrush(Colors.Blue);
break;
case "Yellow":
LayoutRoot.Background = new SolidColorBrush(Colors.Yellow);
break;
default:
LayoutRoot.Background = new SolidColorBrush(Colors.White);
break;
}
}
这就是关于实现部分的全部内容。 让我们看看它的实际效果。
演示
让我们运行我们的应用程序。 因为我们有两个项目,所以逐个运行它们。 运行后,您将有两个浏览器窗口,一个作为Sender
应用程序,另一个作为Receiver
应用程序。 默认情况下,接收者将具有白色背景。 现在转到发送者应用程序,然后选择任何一个单选按钮以选择颜色。 然后单击“Send
”按钮以将颜色消息发送到另一个Silverlight应用程序。 接收者应用程序将根据名称捕获消息,并相应地更改布局的颜色。
请在此处查看相同的演示,这将使您更清楚地了解实现
希望这可以帮助您了解Silverlight应用程序的本地消息传递系统。 请记住,当您的浏览器处于私有模式时,这将不起作用。
历史
- 2011年7月26日:初始帖子