65.9K
CodeProject 正在变化。 阅读更多。
Home

两个本地 Silverlight 应用程序之间的通信

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.71/5 (3投票s)

2011年8月5日

CPOL

1分钟阅读

viewsIcon

16987

关于如何与两个本地 Silverlight 应用程序通信。

引言

让我感到惊讶的是,很少有人讨论“基于 Silverlight 的本地应用程序之间的通信”这一特性。 这并非 Silverlight 的新功能,它自 Silverlight 3 以来就已存在。 换句话说,这将允许在同一台 PC 上运行的两个 Silverlight 应用程序无需使用 Web 服务等方式进行相互通信。 最初,我研究这个功能是为了一个与 Kinect 配合使用的个人项目,但发现它非常有价值,并决定与大家分享。

入门

我们将创建两个独立的 Silverlight 应用程序(选择 Silverlight 4 或 5 Beta)。 我们要创建的第一个应用程序是接收器。

创建接收器

启动 Visual Studio 2010 并创建一个新的 Silverlight 应用程序,命名为“SilverlightReceiver”。

在您的 MainPage.xaml

<Grid x:Name="LayoutRoot" Background="Yellow">
    <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" 
    TextWrapping="Wrap" Text="...Waiting for Message!" x:Name="txtReceiver"/>
</Grid>

在您的 MainPage.xaml.cs

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Messaging;
 
namespace SilverlightReceiver
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
            Loaded += MainPage_Loaded;
        }
 
        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            var messageReceiver = new LocalMessageReceiver
            ("receiver", ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain);
            messageReceiver.MessageReceived += receiver_MessageReceived;
            
            try
            {
                messageReceiver.Listen();
            }
            catch (ListenFailedException)
            {
                MessageBox.Show(
                    "Cannot receive messages." + Environment.NewLine +
                    "There is already a receiver with the name 'receiver'.",
                    "LocalMessageReceiver", MessageBoxButton.OK);
            }
        }
 
        private void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
        {
            txtReceiver.Text = e.Message;
            e.Response = "Message received";
        }
    }
}

在设计模式下,您的接收器的 MainPage.xaml 应该如下所示

创建发送器

启动 Visual Studio 2010 并创建一个新的 Silverlight 应用程序,命名为“SilverlightSender”。

在您的 MainPage.xaml

<Grid x:Name="LayoutRoot">
    <Button Content="Send a Message" Click="SendClick" Margin="10"/>      
</Grid>

在您的 MainPage.xaml.cs

using System.Windows;
using System.Windows.Controls;
using System.Windows.Messaging;
 
namespace SilverlightSender
{
    public partial class MainPage : UserControl
    {
        private LocalMessageSender _messageSender = new LocalMessageSender("receiver");
 
        public MainPage()
          {
              InitializeComponent();
              Loaded += MainPage_Loaded;
          }
 
        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            _messageSender = new LocalMessageSender("receiver",LocalMessageSender.Global);
            _messageSender.SendCompleted += _sender_SendCompleted;
        }
  
          void _sender_SendCompleted(object sender, SendCompletedEventArgs e)
          {
              MessageBox.Show("Response \"" + e.Response + 
              "\" receieved.", "LocalMessageSender", MessageBoxButton.OK);
          }
  
          private void SendClick(object sender, RoutedEventArgs e)
        {
            _messageSender.SendAsync("Don't you love michaelcrump.net?");
         }
    }
}

在设计模式下,您的接收器的 MainPage.xaml 应该如下所示

现在开始运行它!

首先启动接收器应用程序…

然后启动发送器应用程序…

单击“发送消息”按钮,您应该立即看到

现在单击您的接收器应用程序…

…您会看到它现在有了从“发送器”应用程序发送的消息。

结论

这太酷了! 此外,它不需要任何 Web 服务等! 作为参考,您可以查看 MSDN 上的这些页面(我从中获取了一些此演示的代码)。

历史

  • 2011 年 8 月 3 日:初始版本
© . All rights reserved.