关于一个页面中多个silverlight应用程序通信的总结
在没有接触过多个silverlight应用程序通信之前,我们肯定都觉得这个问题很复杂,其实呢,相当的简单。
下面我将通过几个例子让大家了解一下多个silverlight应用程序之间的通讯怎么样实现,好,之后我们可以用他来做网页中
更有趣的小silverlight功能块并使其看似独立实际交相辉映。
第一种方法。
一提到通讯一定有个监听端和一个发送端
主要的提供的两个类:
LocalMessageReceiver:接受消息
LocalMessageSender: 发送消息
示例如下
监听端:
public MainPage() { InitializeComponent(); LocalMessageReceiver Lmr = new LocalMessageReceiver("MyReceiver"); Lmr.MessageReceived += new EventHandler<MessageReceivedEventArgs>(Lmr_MessageReceived); Lmr.Listen(); } //接受到消息的事件方法 void Lmr_MessageReceived(object sender, MessageReceivedEventArgs e) { this.textBox1.Text = e.Message; e.Response = "收到"; }
发送端:
LocalMessageSender Lm = new LocalMessageSender("MyReceiver"); lm.SendAsync(“消息内容”);
还有一点需要注意的
(1)在消息发送方,LocalMessageSender对象有一个ReceiverDomain属性,默认值为null,这意味着,消息的发送方与接收方必须位于同一个域(Domain)中。
什么是域的概念呢,补充一下
“域(Domain)”和“应用程序域(AppDomain)”不是一回事。域表明了Silverlight应用程序的位置信息,诸如:“www.myuniversity.edu.cn”之类,而应用程序域则代表了Silverlight应用程序的运行环境,Silverlight插件在装载一个Silverlight应用程序时,会为其创建一个应用程序域作为其运行环境。
假设某网页使用多个<object>元素承载了多个Silverlight应用程序,则Silverlight插件会为每个Silverlight应用程序创建相互独立的应用程序域,这些Silverlight应用程序的“域”可以相同(只要来源于同一个网站),也可以不同(如果来源于不同的网站)。
如果将发送方的ReceiverDomain属性设置为LocalMessageSender.Global值(其实就是一个仅包容单个“*”字符的字串),则发送方可以向另一个域的Silverlight应用程序发送信息。
LocalMessageReceiver Lmr = new LocalMessageReceiver("MyReceiver", ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain);
(2)接收方和发送方的名字一定要一致,才可以接受和发送消息。同一个域的接受对象LocalMessageReceiver不能重名
第二种方法
第二种方法是在一个本地应用程序中用HyperlinkButton控制另一个本地应用程序的Framet跳转 ,这个是我在做两个silverlight应用通讯
时无意中发现的
<HyperlinkButton Height="23" NavigateUri="/2" TargetName="frame2" Content="2" HorizontalAlignment="Left" Width="50" />
另一个应用中的frame这样写
<sdk:Frame Source="/1" Background="Tan" Height="259" HorizontalAlignment="Left" Name="frame2" VerticalAlignment="Bottom" Width="400">
<sdk:Frame.UriMapper>
<sdk:UriMapper>
<sdk:UriMapping Uri="" MappedUri="/ChildrenPage/Page1.xaml"/>
<sdk:UriMapping Uri="/{pageName}" MappedUri="/ChildrenPage/Page{pageName}.xaml"/>
</sdk:UriMapper>
</sdk:Frame.UriMapper>
</sdk:Frame>
这样点击HyperlinkButton的时候另一个应用中的frame就可以跳转了。
开始我认为是TargetName属性的缘故 设置成外面Frame的名字找到的目标,其实不是这样。
跳转的路径是从浏览器的地址参数中传过来的