在某些特定的业务场景中,可能需要在本地应用之间进行消息传递。这种情况下,本地消息传递机制就显得尤为重要。本文将通过一个简单的Silverlight应用程序示例,介绍如何实现本地消息传递系统。这个示例包括一个发送者项目和一个接收者项目。文章末尾附有演示,以便更直观地理解实现过程。
首先,需要为示例应用程序创建项目结构。在这个示例中,将创建两个不同的Silverlight项目,分别命名为“Sender”和“Receiver”。Sender项目将广播消息,而Receiver项目将捕获该消息并执行相应的操作。以下是项目结构的参考图:
接下来,将创建发送者应用程序的用户界面。在这个界面中,将提供几个单选按钮以选择不同的颜色,以及一个按钮,允许用户提交消息进行广播。以下是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>
这将在用户界面中呈现如下效果:
现在是时候将消息发送给接收者应用程序了。为此,有一个名为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 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应用程序。接收者应用程序将根据名称捕获消息,并相应地改变布局的颜色。