关于一个页面中多个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的名字找到的目标,其实不是这样。
跳转的路径是从浏览器的地址参数中传过来的
 
 
 
posted @ 2011-04-01 22:41  allanxyq  阅读(2003)  评论(5编辑  收藏  举报