在去年我曾经写过一篇文章,介绍如何在同一页面下多个Silverlight应用间传递事件信息,
当时所使用的技巧就是借助HTML页面元素来传递,当然这种方式也支持向其它第三方ActiveX控
件传递信息。但因为引入了JS代码,让开发者感觉有些别扭。必定这种消息传递写在 CS代码中
会更容易被接受。
好在Silverlight3 beta中提供了两个重要的类,它们都是以“LocalMessage”打头,其位于
“System.Windows.Messaging”名空间下:
LocalMessageSender :消息发送器类
LocalMessageReceiver:消息接收器类
顾名思义,它们就是所谓消息的“发送方”和“接收方”。
而使用它们也很简单,首先我们要先创建一个Silverlight3 Beta项目,名为:LocalMessage。
然后将下面的XAML代码复制到MainPage.xaml文件中:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><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代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->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);
}
在上面代码中,先声明一个 LocalMessageSender对象,因为该类的构造方法被重载,支持两个
方式,相应参数说明如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> ReceiverName: 接收器名称,因为发送与接收方必须使用相应的ReceiverName,这一点大家可以
想一想我们平时打电话必须拨某一号码才能与某人通信。
ReceiverDomain:获取LocalMessageReceiver的域信息(只有指定的域才能获取消息),这主要
是解决跨域和安全性问题
这里ReceiverDomain还可使用System.Windows.Messaging.LocalMessageSender.Global,这样就
设置为Global域了。
在绑定相应的方法(SendCompleted)之后就可发送异步消息了。
接下来介绍一下接收方代码。
首先要先创建一个接收方的Silverlight应用,这里命名为“LocalMessageReceiver”。下面是
相应的XAML代码:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><UserControl x:Class="LocalMessageReceiver.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="200">
<Grid x:Name="LayoutRoot" Background="Blue" >
<TextBlock
Foreground="White"
FontSize="12"
x:Name="txtMessage"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>
</UserControl>
而CS代码如下所示:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->void OnLoaded(object sender, RoutedEventArgs args)
{
List<string> allowedSenderDomains = new List<string>();
allowedSenderDomains.Add( "silverlightshow.net" );
allowedSenderDomains.Add( "http://www.silverlightshow.net/" );
allowedSenderDomains.Add("localhost");
//下面使用全命名主要是项目名称与已有的LocalMessageReceiver重名所致
System.Windows.Messaging.LocalMessageReceiver receiver =
new System.Windows.Messaging.LocalMessageReceiver("MessageContact", ReceiverNameScope.Domain, allowedSenderDomains);
receiver.MessageReceived += (s, e) =>
{
e.Response = "接收方收到消息!";
Dispatcher.BeginInvoke(() =>
{
txtMessage.Text = String.Format("收到信息 [{0}]", e.Message);
});
};
receiver.Listen();
}
我们看到这里LocalMessageReceiver类实例实始化参数,其中:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> ReceiverName:参见上面的LocalMessageSender
NameScope: ReceiverNameScope.Domain, 该枚举参数用于标识是Domain还是Global。
AllowedSenderDomains: 允许发送的域信息。
因为之前发送方已指定了域信息,即“localhost”,所以这里在列表变量:allowedSenderDomains
中添加了“localhost”,并标识以 ReceiverNameScope.Domain。
下面我们看一下效果:
当然如果发送方没有采用与接收方相同的ReceiverName或者发送方的ReceiverDomain未出现在接收
方的AllowedSenderDomains列表中,就会出现错误。这一点大家下载源码后运行一下就可以了。
另外就是如果发送方设置的是LocalMessageSender.Global,那么在接收方必须相应是:
ReceiverNameScope.Global
这样才能确保信息的传递,源码下载:http://files.cnblogs.com/daizhj/LocalMessage.rar。
原文链接:http://www.cnblogs.com/daizhj/archive/2009/03/31/1423396.html
作者: daizhj, 代震军
分享到:
相关推荐
在Silverlight应用中,页面间的参数传递是实现不同功能模块间数据交互的基础。通过有效的参数传递机制,开发者能够确保数据的一致性和准确性,同时也能够提高程序的可维护性和扩展性。例如,在一个电子商务应用中,...
Silverlight应用程序通常由多个用户界面(UI)元素组成,这些元素可以通过不同的导航控件(如Frame或NavigationWindow)组织成“页面”。页面在Silverlight中不是独立的HTML文件,而是XAML文件,它们定义了UI布局和...
Prism的核心特性之一是模块化,它允许我们将应用程序分解为多个独立的模块,每个模块负责特定的功能。在本示例中,我们有两个模块,每个模块都有自己的业务逻辑、视图和视图模型。这种结构有助于代码组织,使得开发...
5. **应用场景**:这样的示例代码对于理解如何在Silverlight应用中实现多页面间的导航和数据共享具有实践价值,尤其适用于那些需要在不同页面间维护状态或传递用户输入数据的场景。 总之,这个基于Silverlight 2和...
在名为`SLClipboardSupport`的源码文件中,你应该能看到如何在Silverlight应用中创建一个剪切板操作的实例。这个例子可能包括一个按钮,当用户点击时触发剪切或复制操作,并可能有一个事件处理器来处理这些操作。...
文件名为"PageChange"可能暗示了示例代码或教程是关于如何在Silverlight应用中处理页面变化和数据传递的。为了深入了解这一主题,可以查看提供的"PageChange"文件,这可能包含具体的示例代码或详细步骤,帮助开发者...
此外,Silverlight应用还可以通过本地消息传递在不同域之间通信,实现模块化设计。 **百度Silverlight应用** 百度作为国内知名互联网公司,可能使用Silverlight技术来构建其某些高级功能或特定应用,如多媒体播放...
Silverlight应用可以通过HTTP头部、查询字符串参数或自定义身份验证协议来传递用户的凭证。服务器端应验证这些凭证,并确保只有授权用户才能上传文件。 7. **服务器端处理**:在服务器端,接收到文件后,可能需要...
这个例子可能涵盖了诸如用户管理、订单处理、库存控制等多个业务场景。开发者可能利用WCF RIA Services来定义服务器端的业务规则和服务接口,然后在Silverlight客户端展示数据并提供用户交互。通过这种方式,客户端...
步骤1:在HTML页面中,嵌入Silverlight对象并设置适当的属性,如源(Source)和初始化参数(InitParams),以便在Silverlight应用启动时传递必要的信息。 步骤2:在Silverlight应用中,创建一个JavaScript调用的...
在提供的`sample`文件中,可能包含了实现这种通信的示例代码,包括Silverlight应用的C#代码和HTML页面的JavaScript代码。通过分析这些代码,可以更深入地理解上述概念。 总之,Silverlight与Web页面的交互是通过`...
3. 聊天室:可能包含多个主题或兴趣相关的聊天室,用户可以选择加入并参与讨论。 4. 历史记录:聊天记录会被保存,用户可以查看历史对话,这需要数据库支持来存储和检索聊天数据。 5. 用户界面:Silverlight 2利用...
6. **调试与测试**:由于涉及多个层次的交互,调试和测试会相对复杂。确保在不同浏览器和操作系统上进行充分的兼容性测试。 需要注意的是,这种技术在现代Web开发中已不常用,因为现代浏览器逐渐放弃了对ActiveX的...
在Silverlight应用中,打印功能允许用户将内容从UI直接输出到打印机,而无需借助操作系统或浏览器的内置打印对话框。这种功能对于那些需要提供离线打印体验的应用尤其重要,比如报表和文档。 要实现Silverlight打印...
总的来说,"Silverlight项目联网获取天气,PM2.5等详细天气信息"涉及了Web客户端开发、网络通信、数据解析、UI设计等多个方面,需要开发者具备全面的技能和对新技术的敏感度。通过这个项目,不仅可以学习Silverlight...
通过JavaScript与Silverlight对象交互,将文件选择事件传递给Silverlight应用。 2. **文件选择事件处理**:在Silverlight中监听文件选择事件,获取用户选择的文件信息。你可以使用`System.Windows.Browser....
本文将深入探讨如何在Silverlight应用中处理数据,特别是如何在服务端与客户端之间传递DataTable对象。 首先,`Silverlight 数据处理服务端传DataTable`这个标题涉及到的关键技术是Silverlight的数据交互和服务通信...
这个系统可能采用了客户端-服务器架构,Silverlight客户端负责展示用户界面和处理用户输入,而服务器端则处理消息传递、用户验证和聊天历史记录的存储。通过WCF(Windows Communication Foundation)服务,客户端和...