• 稳扎稳打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;  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;  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
    [源码下载]
  • 相关阅读:
    删除List集合中的元素你碰到过这样的陷阱吗?
    从spring框架中的事件驱动模型出发,优化实际应用开发代码
    SpringBoot启动原理及相关流程
    基于SpringBoot实现定时任务的设置(常用:定时清理数据库)
    C#开发中常用的加密解密方法
    http://go.microsoft.com/fwlink/?linkid问题
    移动端开发必须知道的小技巧
    工作中遇到的细节问题总结(二)
    redis分布式锁和消息队列
    join和wait
  • 原文地址:https://www.cnblogs.com/bingyun84/p/1557342.html
Copyright © 2020-2023  润新知