在去年我曾经写过一篇文章,介绍如何在同一页面下多个Silverlight应用间传递事件信息,
当时所使用的技巧就是借助HTML页面元素来传递,当然这种方式也支持向其它第三方ActiveX控件传递信息。但因为引入了JS代码,让开发者感觉有些别扭。必定这种消息传递写在 CS代码中会更容易被接受。
好在Silverlight3 beta中提供了两个重要的类,它们都是以“LocalMessage”打头,其位于“System.Windows.Messaging”名空间下:
LocalMessageSender :消息发送器类
LocalMessageReceiver:消息接收器类
顾名思义,它们就是所谓消息的“发送方”和“接收方”。
而使用它们也很简单,首先我们要先创建一个Silverlight3 Beta项目,名为:LocalMessage。
然后将下面的XAML代码复制到MainPage.xaml文件中:
<UserControl x:Class="LocalMessage.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="200">
<StackPanel x:Name="LayoutRoot" Background="AliceBlue">
<TextBox
Margin="10"
FontSize="24"
x:Name="txtMessage" />
<Button
Content=" 发 送 "
HorizontalAlignment="Right"
Margin="10"
Click="OnSendMessage" />
<TextBlock TextWrapping="Wrap"
Foreground="Blue"
FontSize="12"
x:Name="txtResponse"
HorizontalAlignment="Center" />
</StackPanel>
</UserControl>
下面是相应的CS代码:
void OnSendMessage(object sender, RoutedEventArgs args)
{
LocalMessageSender msgSender = new LocalMessageSender("MessageContact", "localhost");
EventHandler<SendCompletedEventArgs> handler = null;
handler = (s, e) =>
{
Dispatcher.BeginInvoke(() =>
{
msgSender.SendCompleted -= handler;
if (e.Error != null)
{
txtResponse.Text = String.Format("错误 [{0}]", e.Error.Message);
}
else
{
txtResponse.Text = String.Format("响应 [{0}]", e.Response == null ? "None" : e.Response);
}
});
};
msgSender.SendCompleted += handler;
msgSender.SendAsync(txtMessage.Text);
}