稳扎稳打Silverlight(39) - 3.0编程之Element to Element Binding, 通信之二进制XML通信, 本地连接

[源码下载]


稳扎稳打Silverlight(39) - 3.0编程之Element to Element Binding, 通信之二进制XML通信, 本地连接


作者: webabcd


介绍
Silverlight 3.0 绑定的新增功能和通信的新增功能
  • Element to Element Binding - 支持 Element 到 Element 间的绑定
  • 二进制XML通信 - 与 WCF 服务间通信,可以使用二进制 XML 传递数据(提高传输性能) 
  • 本地连接 - 允许客户端的两个 Silverlight 程序之间直接进行通信(不用通过服务端)


在线DEMO
http://www.cnblogs.com/webabcd/archive/2009/08/04/1538238.html


示例
1、Element to Element Binding 的演示
ElementBinding.xaml 
< navigation:Page  x:Class ="Silverlight30.Coding.ElementBinding"  
           xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
           xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"  
           xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable
="d"
           xmlns:navigation
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth
="640"  d:DesignHeight ="480"
           Title
="ElementBinding Page" >
    
< Grid  x:Name ="LayoutRoot" >
        
< StackPanel  VerticalAlignment ="Top"  HorizontalAlignment ="Left" >
        
            
<!-- Element to Element 绑定的支持 -->
            
            
<!--
                绑定方式1:{Binding 绑定的属性名称, Mode=, ElementName=绑定的对象名称}
                绑定方式2:{Binding ElementName=绑定的对象名称, Path=绑定的属性名称, Mode=}
                Mode的可用值有:OneTime, OneWay, TwoWay
            
-->
            
< Slider  x:Name ="silder"  Value ="50"  Minimum ="1"  Maximum ="100"  LargeChange ="5"  Width ="500" ></ Slider >
            
< TextBox  Text =" {Binding Value, Mode=TwoWay, ElementName=silder} "   />
            
            
< Slider  Minimum ="1"  Maximum ="100"  LargeChange ="5"  Width ="500"
                    Value
=" {Binding ElementName=textBox, Path=Text, Mode=TwoWay } " ></ Slider >
            
< TextBox  x:Name ="textBox"  Text ="50"   />
            
        
</ StackPanel >
    
</ Grid >
</ navigation:Page >


2、以二进制 XML 传递数据的演示
服务端(WCF)
BinaryXmlService.svc
using  System;
using  System.Linq;
using  System.Runtime.Serialization;
using  System.ServiceModel;
using  System.ServiceModel.Activation;
using  System.Collections.Generic;
using  System.Text;

namespace  Silverlight30.Service
{
    
/// <summary>
    
/// 一个简单的 WCF 服务
    
/// </summary>

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode 
= AspNetCompatibilityRequirementsMode.Allowed)]
    
public class BinaryXmlService
    
{
        [OperationContract]
        
public string Hello(string name)
        
{
            
return "Hello: " + name;
        }

    }

}


Web.config
< system.serviceModel >
    
< bindings >
        
< customBinding >
            
< binding  name ="customBinding0" >
                
< binaryMessageEncoding  />
                
< httpTransport  />
            
</ binding >
        
</ customBinding >
    
</ bindings >
    
< serviceHostingEnvironment  aspNetCompatibilityEnabled ="true"   />
    
< behaviors >
        
< serviceBehaviors >
            
< behavior  name ="Silverlight30.Service.BinaryXmlServiceBehavior" >
                
< serviceMetadata  httpGetEnabled ="true"   />
                
< serviceDebug  includeExceptionDetailInFaults ="false"   />
            
</ behavior >
        
</ serviceBehaviors >
    
</ behaviors >
    
< services >
        
< service  behaviorConfiguration ="Silverlight30.Service.BinaryXmlServiceBehavior"
            name
="Silverlight30.Service.BinaryXmlService" >
            
< endpoint  address =""  binding ="customBinding"  bindingConfiguration ="customBinding0"
                contract
="Silverlight30.Service.BinaryXmlService"   />
            
< endpoint  address ="mex"  binding ="mexHttpBinding"  contract ="IMetadataExchange"   />
        
</ service >
    
</ services >
</ system.serviceModel >

客户端
BinaryXml.xaml
< navigation:Page  x:Class ="Silverlight30.Communication.BinaryXml"  
           xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
           xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"  
           xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable
="d"
           xmlns:navigation
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth
="640"  d:DesignHeight ="480"
           Title
="BinaryXml Page" >
    
< Grid  x:Name ="LayoutRoot" >
        
< StackPanel  Orientation ="Horizontal"  Height ="30" >
        
            
<!-- 支持二进制 XML 通信 -->
        
            
< TextBox  x:Name ="txtName"  Text ="webabcd"   />
            
< Button  x:Name ="btnHelloConfig"  Content ="引用服务后(使用代理),通过配置的方式与服务端做二进制XML通信"  Click ="btnHelloConfig_Click"   />
            
< Button  x:Name ="btnHelloCoding"  Content ="引用服务后(使用代理),通过编程的方式与服务端做二进制XML通信"  Click ="btnHelloCoding_Click"   />
        
        
</ StackPanel >
    
</ Grid >
</ navigation:Page >

BinaryXml.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;
using  System.Windows.Navigation;

using  Silverlight30.BinaryXmlService;
using  System.ServiceModel.Channels;
using  System.ServiceModel;

namespace  Silverlight30.Communication
{
    
public partial class BinaryXml : Page
    
{
        
public BinaryXml()
        
{
            InitializeComponent();
        }


        
void client_HelloCompleted(object sender, HelloCompletedEventArgs e)
        
{
            
if (e.Error == null)
                MessageBox.Show(e.Result);
            
else
                MessageBox.Show(e.Error.ToString());
        }


        
private void btnHelloConfig_Click(object sender, RoutedEventArgs e)
        
{
            
// 通过配置文件(ServiceReferences.ClientConfig)的方式调用以二进制 XML 通信的 WCF 服务(需要使用代理)
            BinaryXmlServiceClient client = new BinaryXmlServiceClient();
            client.HelloCompleted 
+= new EventHandler<HelloCompletedEventArgs>(client_HelloCompleted);
            client.HelloAsync(txtName.Text);
        }


        
private void btnHelloCoding_Click(object sender, RoutedEventArgs e)
        
{
            
// 通过编程的方式调用以二进制 XML 通信的 WCF 服务(需要使用代理)
            BinaryMessageEncodingBindingElement binary = new BinaryMessageEncodingBindingElement();
            HttpTransportBindingElement transport 
= new HttpTransportBindingElement();
            CustomBinding binding 
= new CustomBinding(binary, transport);
            EndpointAddress address 
= new EndpointAddress("http://localhost:8616/BinaryXmlService.svc");
            BinaryXmlServiceClient client 
= new BinaryXmlServiceClient(binding, address);
            client.HelloCompleted 
+= new EventHandler<HelloCompletedEventArgs>(client_HelloCompleted);
            client.HelloAsync(txtName.Text);
        }

    }

}


ServiceReferences.ClientConfig
< configuration >
    
< system.serviceModel >
        
< bindings >
            
< customBinding >
                
< binding  name ="CustomBinding_BinaryXmlService" >
                    
< binaryMessageEncoding  />
                    
< httpTransport  maxReceivedMessageSize ="2147483647"  maxBufferSize ="2147483647"   />
                
</ binding >
            
</ customBinding >
        
</ bindings >
        
< client >
            
< endpoint  address ="http://localhost:8616/BinaryXmlService.svc"
                binding
="customBinding"  bindingConfiguration ="CustomBinding_BinaryXmlService"
                contract
="BinaryXmlService.BinaryXmlService"  name ="CustomBinding_BinaryXmlService"   />
        
</ client >
    
</ system.serviceModel >
</ configuration >


3、本地连接的演示
Silverlight 程序 1
LocalConnection.xaml
< navigation:Page  x:Class ="Silverlight30.Communication.LocalConnection"  
           xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
           xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"  
           xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"
           xmlns:mc
="http://schemas.openxmlformats.org/markup-compatibility/2006"
           mc:Ignorable
="d"
           xmlns:navigation
="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
           d:DesignWidth
="640"  d:DesignHeight ="480"
           Title
="LocalConnection Page" >
    
< Grid  x:Name ="LayoutRoot" >
        
< StackPanel >
        
            
<!-- 结合 Silverlight30.LocalConnection/MainPage.xaml 中的项目演示 Silverlight 对本地连接的支持 -->
        
            
< TextBlock  Text ="我是 abc"   />
            
< Button  x:Name ="btnSubmit"  Content ="提交"  Click ="btnSubmit_Click"   />
            
< TextBlock  x:Name ="lblResult"   />
            
        
</ StackPanel >
    
</ Grid >
</ navigation:Page >

LocalConnection.xaml.cs
/*
 * LocalMessageReceiver - 本地连接接收器
 *     ReceiverName - 接收器的名称。与另一个 Silverlight 程序所设置的发送器的接收器名称相对应
 *     AllowedSenderDomains - 信任的发送器所属域名列表
 *     DisableSenderTrustCheck - 是否不理会 Vista 下的 IE 7 的保护模式。默认值为 false
 *     NameScope - 接收器名称是在同域唯一还是在全域唯一(ReceiverNameScope.Domain 同域唯一,默认值;ReceiverNameScope.Global 全域唯一)
 *     Listen() - 开始监听发送过来的信息
 *     MessageReceived事件 - 接收完成事件
 *     
 * LocalMessageSender - 本地连接发送器
 *     ReceiverName - 接收器的名称。与另一个 Silverlight 程序所设置的接收器的接收器名称相对应
 *     ReceiverDomain - 将要发送至的接收器所属域名
 *     SendAsync(string message, object userState) - 异步发送数据。(参数1:需要发送的信息;参数2:上下文,可以传递给发送完成事件)
 *     SendCompleted事件 - 发送完成事件
 
*/


using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;
using  System.Windows.Navigation;
using  System.Windows.Messaging;

namespace  Silverlight30.Communication
{
    
public partial class LocalConnection : Page
    
{
        LocalMessageSender _sender;

        
public LocalConnection()
        
{
            InitializeComponent();

            
this.Loaded += new RoutedEventHandler(LocalConnection_Loaded);
        }


        
void LocalConnection_Loaded(object sender, RoutedEventArgs e)
        
{
            _sender 
= new LocalMessageSender("abc");

            LocalMessageReceiver receiver 
= new LocalMessageReceiver("xyz");
            receiver.MessageReceived 
+= new EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);
            receiver.Listen();            
        }


        
void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
        
{
            lblResult.Text 
+= e.Message + "\r\n";
        }


        
private void btnSubmit_Click(object sender, RoutedEventArgs e)
        
{
            _sender.SendAsync(
"在 abc 单击了按钮");
        }

    }

}


Silverlight 程序 2
Silverlight30.LocalConnection/MainPage.xaml
< UserControl  x:Class ="Silverlight30.LocalConnection.MainPage"
    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d
="http://schemas.microsoft.com/expression/blend/2008"  xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"  
    mc:Ignorable
="d"  d:DesignWidth ="640"  d:DesignHeight ="480" >
    
< Grid  x:Name ="LayoutRoot" >
        
< StackPanel >
        
            
<!-- 结合 Silverlight30/Communication/LocalConnection.xaml 中的项目演示 Silverlight 对本地连接的支持 -->
        
            
< TextBlock  Text ="我是 xyz"   />
            
< Button  x:Name ="btnSubmit"  Content ="提交"  Click ="btnSubmit_Click"   />
            
< TextBlock  x:Name ="lblResult"   />
            
        
</ StackPanel >
    
</ Grid >
</ UserControl >

Silverlight30.LocalConnection/MainPage.xaml.cs
using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Net;
using  System.Windows;
using  System.Windows.Controls;
using  System.Windows.Documents;
using  System.Windows.Input;
using  System.Windows.Media;
using  System.Windows.Media.Animation;
using  System.Windows.Shapes;

using  System.Windows.Messaging;

namespace  Silverlight30.LocalConnection
{
    
public partial class MainPage : UserControl
    
{
        LocalMessageSender _sender;

        
public MainPage()
        
{
            InitializeComponent();

            
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        }


        
void MainPage_Loaded(object sender, RoutedEventArgs e)
        
{
            _sender 
= new LocalMessageSender("xyz");

            LocalMessageReceiver receiver 
= new LocalMessageReceiver("abc");
            receiver.MessageReceived 
+= new EventHandler<MessageReceivedEventArgs>(receiver_MessageReceived);
            receiver.Listen();
        }


        
void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
        
{
            lblResult.Text 
+= e.Message + Environment.NewLine;
        }


        
private void btnSubmit_Click(object sender, RoutedEventArgs e)
        
{
            _sender.SendAsync(
"在 xyz 单击了按钮");
        }

    }

}


以上两个 Silverlight 程序间可以进行本地通信
Silverlight30.LocalConnectionTestPage.html
< object  data ="data:application/x-silverlight-2,"  type ="application/x-silverlight-2"
    height
="100%"  style ="float: left; width: 50%" >
    
< param  name ="source"  value ="ClientBin/Silverlight30.xap"   />
    
< param  name ="onError"  value ="onSilverlightError"   />
    
< param  name ="background"  value ="white"   />
    
< param  name ="minRuntimeVersion"  value ="3.0.40624.0"   />
    
< param  name ="autoUpgrade"  value ="true"   />
    
< href ="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0"  style ="text-decoration: none" >
        
< img  src ="http://go.microsoft.com/fwlink/?LinkId=108181"  alt ="Get Microsoft Silverlight"
            style
="border-style: none"   />
    
</ a >
</ object >
< object  data ="data:application/x-silverlight-2,"  type ="application/x-silverlight-2"
    height
="100%"  style ="float: left; width: 50%" >
    
< param  name ="source"  value ="ClientBin/Silverlight30.LocalConnection.xap"   />
    
< param  name ="onError"  value ="onSilverlightError"   />
    
< param  name ="background"  value ="white"   />
    
< param  name ="minRuntimeVersion"  value ="3.0.40624.0"   />
    
< param  name ="autoUpgrade"  value ="true"   />
    
< href ="http://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0"  style ="text-decoration: none" >
        
< img  src ="http://go.microsoft.com/fwlink/?LinkId=108181"  alt ="Get Microsoft Silverlight"
            style
="border-style: none"   />
    
</ a >
</ object >


OK
[源码下载]

你可能感兴趣的:(silverlight)