Udostępnij za pośrednictwem


SilverLight 3: Local Connection

Рассмотрим пространство имен System.Windows.Messaging, которое позволяет наладить взаимодействие между несколькими приложениями SilverLight.

Создадим простое приложение, которое отображает эллипс двигающийся снизу вверх:

<UserControl x:Class="SilverlightApplication57.MainPage"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Width="400" Height="300" Loaded=”UserControl_Loaded”>
    <UserControl.Resources>
        <Storyboard x:Name="sb1" Completed="sb1_Completed">
            <DoubleAnimation Storyboard.TargetName="el1"
                             Storyboard.TargetProperty="(Canvas.Top)"
                             From="300" To="-30" Duration="0:0:5">
            </DoubleAnimation>
        </Storyboard>
    </UserControl.Resources>
    <Canvas x:Name="LayoutRoot" Background="White">
        <Ellipse x:Name="el1" Width="30" Height="30" Fill="Blue" Canvas.Left="200" Canvas.Top="300"></Ellipse>
    </Canvas>
</UserControl>

Запуск анимации будет происходить при загрузке главного контейнера:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    sb1.Begin();
}

Создайте второе приложение, которое будет содержать точно такой же код, за исключением метода UserControl_Loaded. Разместите приложения на HTML странице следующим образом:

image

Давайте попробуем реализовать код прриложений таким образом, чтобы после окончания анимации в приложении 1, запускалась анимация во втором приложении. Таким образом, мы должны достигнуть эффета, когда наш шарик будет “перелетать” из одного приложения в другое.

Реализуем следующий код в первом приложении:

LocalMessageSender msgSender = new LocalMessageSender("DownSide");

public MainPage()
{
    InitializeComponent();

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

void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
{
    sb1.Begin();
}

private void sb1_Completed(object sender, EventArgs e)
{
    msgSender.SendAsync("start");
}

Тут мы создали объект типа LocalMessageSender, в задачи которого входит отправка сообщения “слушателю” с указанным именем (DownSide, наверное стоило назвать по другому). Этот метод отправляет сообщение сразу после окончания анимации с помощью метода SendAsync (фактически передает управление другому приложению).

Объект LocalMessageReceiver, напротив, ожидает сообщение от других приложений. Как только сообщение приходит (второе приложение закончило анимацию), то тут же анимация запускается повторно (полетел еще один шарик).

Код во втором приложении выглядит аналогично:

LocalMessageSender msgSender = new LocalMessageSender("UpSide");

public MainPage()
{
    InitializeComponent();

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

void receiver_MessageReceived(object sender, MessageReceivedEventArgs e)
{
    sb1.Begin();
}

private void sb1_Completed(object sender, EventArgs e)
{
    msgSender.SendAsync("start");
}

Откомпилировав и запустив данный пример, мы получим желаемый эффект:

image

Следует отметить, что если Ваши приложения загружаются из различных доменов, то наладить взаимодействие между ними также возможно. Для этого просто следует указать имя домена в конструкторе классов LocalMessage…