65.9K
CodeProject 正在变化。 阅读更多。
Home

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

2011 年 7 月 26 日

CPOL

3分钟阅读

viewsIcon

114854

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

引言

有时,需要在两个本地Silverlight应用程序之间进行通信。 虽然这种情况非常有限,但根据您的业务需求,它可能是必需的。 在这种情况下,本地消息传递机制就派上用场了。

在本文中,我们将学习这个本地消息传递系统,使用一个小的Silverlight应用程序,其中我们将有一个发送项目和一个接收项目。 在文章的最后,我嵌入了一个演示,这将使您更清楚地了解我们将在演示中做什么。 让我们更多地讨论这个话题。

创建项目结构

让我们从为我们的示例演示应用程序创建项目结构开始。 在这个演示中,我们将创建两个不同的Silverlight项目,分别称为“Sender”和“Receiver”。 Sender项目将广播一些消息,接收者将捕获该消息并根据该消息执行下一个操作。

这是供您参考的项目结构

Silverlight Local Messaging - Project Structure

创建发送者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中呈现如下

Silverlight Local Messaging - Sender's 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),您可以在其中检查ReceiverNameReceiverDomainMessageResponse(如果有)。

消息接收的实现

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 Local Messaging Demo

希望这可以帮助您了解Silverlight应用程序的本地消息传递系统。 请记住,当您的浏览器处于私有模式时,这将不起作用。

历史

  • 2011年7月26日:初始帖子
© . All rights reserved.