在去年我曾经写过一篇文章,介绍如何在同一页面下多个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, 代震军
分享到:
相关推荐
● 对于包含多个用户的应用而言,可伸缩性非常困难。服务器必须管理 多个客户端连接并处理客户端状态。 ● 为应用提供服务需要ASP.NET Core服务器。不可能的无服务器部署 方案(例如,通过CDN为应用提供服务)。
管家婆分销ERP系列是一套针对具有一定规模的企业应用的信息化管理整体解决方案,集进销存、财务、分销、OA管理一体化,致力于帮助企业建立起一个简捷、高效的实时运营管理平台,实现物流、资金流、信息流的在线动态...
6.3 在页面间传送信息 6.3.1 查询字符串 6.3.2 跨页回发 6.4 cookie 6.5 会话状态 6.5.1 会话架构 6.5.2 使用会话状态 6.5.3 配置会话状态 6.5.4 会话状态安全 6.6 应用程序状态 6.7 总结 第...
6.3 在页面间传送信息 186 6.3.1 查询字符串 187 6.3.2 跨页回发 188 6.4 cookie 193 6.5 会话状态 194 6.5.1 会话架构 194 6.5.2 使用会话状态 196 6.5.3 配置会话状态 197 6.5.4 会话状态安全 ...
13.8 实现多个具有相同方法名和签名的接口 13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 ...
13.8 实现多个具有相同方法名和签名的接口 13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 ...
13.8 实现多个具有相同方法名和签名的接口 13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 ...
13.8 实现多个具有相同方法名和签名的接口 13.9 用显式接口方法实现来增强编译时类型安全性 13.10 谨慎使用显式接口方法实现 13.11 设计:基类还是接口? 第14章 字符、字符串和文本处理 14.1 字符 14.2 ...
6.3.1 在主题中添加多个css215 6.3.2 使用css改变页面布局215 6.4 创建全局主题219 6.5 动态应用主题220 6.6 小结225 第7章 使用用户控件创建定制控件226 7.1 创建用户控件226 7.1.1 在web配置文件中注册用户控件228...