Makale Özeti

Merhaba arkadaşlar, bu makalemizde Silverlight 3 Beta ile birlikte gelen Lokal Mesajlaşma (Local Messaging) işleminin nasıl yapıldığını inceleyeceğiz.

Makale

Silverlight 3 Beta ile birlikte gelen Local Messaging(Lokal Mesajlaşma) özelliği ile iki Silverlight uygulaması arasında iletişim kurup birbirlerine mesajlar göndermesini sağlayabiliyoruz. İster bir sayfada ki iki Silverlight uygulaması arasında, ister sekmeler(tab) arasında ki sayfaların içerisinde yer alan Silverlight uygulamalarında ve istersek farklı browserlar da bulunan Silverlight uygulamalarının birbirleriyle haberleşmesini sağlayıp buna bağlı olarak çeşitli işlemler yapıp birbirleri arasında veri alışveriş yapabiliyoruz. Yani Internet Explorer da çalışan bir Silverlight uygulaması, Safari de çalışan Silverlight uygulamasına bir mesaj gönderebiliyor. Safari de çalışan uygulama da bu mesaja bağlı olarak işlemler yapabiliyor. System.Windows.Messaging namespace’i altında mesaj göndermek ve mesajı almak için 2 sınıf var. Mesajı göndermek için LocalMessageSender, Mesajı almak için LocalMessageReceiver sınıfını kullanıyoruz.

Yeni bir Silverlight uygulaması oluşturalım. Bu uygulama bizim için başka bir uygulama ile iletişim kurup o uygulamaya mesaj gönderecek. Bu uygulama içinde bir TextBox ve bir de Button olsun. Butona bastığımızda TextBox’a girilen bilgiyi diğer uygulamaya göndereceğiz.

[XAML]

<UserControl xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006”
x
:Class="Silverlight30LocalMessaging.MainPage" Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<TextBox x:Name="txtMessage" Margin="82,86,86,0" VerticalAlignment="Top" Text="" TextWrapping="Wrap"/>
<Button x:Name="btnGonder" Margin="163,124,173,0"VerticalAlignment="Top" Content=" Gönder"/>
</Grid>
</UserControl>

Butona tıklandığında mesaj gönderme işlemini yapacağız, bunun için ilk olarak Click eventini oluşturalım. Bu Event içinde mesajı gönderebilmemiz için postaci isminde LocalMessageSender nesnesi oluşturalım. LocalMessageReceiver nesnesinin SendAsync metodunda alıcıya göndereceğimiz bilgiyi bildiriyoruz. Mesaj gönderildiğinde tetiklenen SendCompleted isminde bir event var. Bu eventinin eventargument’in Response özelliği ile mesajı alanın bize gönderdiği cevabı alabiliriz.

[C#]
namespace Silverlight30LocalMessaging
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
// Button için Click Eventini oluşturalım.
this.btnGonder.Click += new RoutedEventHandler(btnGonder_Click);
}

void btnGonder_Click(object sender, RoutedEventArgs e)
{

// Local Messaging özelliğini kullanabilmemiz için System.Windows.Messaging namespace’i altında yer alan Local MessageSender sınıfını kullanıyoruz. Yapıcı metotda alıcı için bir isim belirtiyoruz.
System.Windows.Messaging.LocalMessageSender postaci = new System.Windows.Messaging.LocalMessageSender("Adres");

// Gönderilecek olan mesajı SendAsync metodu ile gönderiyoruz.

postaci.SendAsync(txtMessage.Text);

// Mesaj yerine gettiğinde çalışacak olan eventi oluşturalım.

postaci.SendCompleted += new EventHandler<System.Windows.Messaging.SendCompletedEventArgs>(postaci_SendCompleted);
}

// Mesaj yerine gettiğinde çalışacak olan event. Mesajı alan silverlight uygulaması geriye bir yanıt gönderebilir, e.Response özelliği ile alıcının bize yolladığı bu yanıtı verir.

void postaci_SendCompleted(object sender, System.Windows.Messaging.SendCompletedEventArgs e)
{
MessageBox.Show(e.Response);
}
}
}

Mesajı gönderdik, mesajı alacak bir alıcı yani başka bir Silverlight uygulamasına ihtiyacımız var. Bunun için bir Silverlight uygulaması daha oluşturalım. Bu uygulamada sadece TextBlock olsun. TextBlock kontrolünün text özelliğinde gönderilen mesajı görüntüleyeceğiz.

[XAML]
<UserControl x:Class="Silverlight30LocalMessagingAlici.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<TextBlock x:Name="tbAlici" FontSize="20" HorizontalAlignment="Center" VerticalAlignment="Center" ></TextBlock>
</Grid>
</
UserControl>

Uygulama çalıştığında Mesajları alabilmek için alici adında LocalMessageReceiver nesnesi oluşturalım. LocalMessageReceiver nesnesinin gönderilen mesajları alabilmesi için Listen metodunu çağırmamız gerekir. Uygulamaya Mesajlar asenkron olarak gelecektir, Mesaj geldiğinde haberdar olabilmemiz için MessageReceived isimli bir event var. Bu event ile gelen mesajı alıp, mesajı gönderene cevap gönderebiliriz. Gelen mesajı almak için MessageReceived eventinin argümanları arasında Message isimli bir özellik var. Mesajı gönderene cevap göndermek için de Response özelliğini kullanabiliyoruz

[C#]
namespace Silverlight30LocalMessagingAlici
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();

// Uygulama çalıştığında çalışacak olan event.

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

void MainPage_Loaded(object sender, RoutedEventArgs e)
{

// Uygulama çalıştığında mesajın alınabilmesi için LocalMessageReceiver nesnesini oluşturalım. Yapıcı metodunda gönderen tarafında bildirilen adresi bildiriyoruz.

System.Windows.Messaging.LocalMessageReceiver alici = new System.Windows.Messaging.LocalMessageReceiver("Adres");

// Alıcıyı mesajları alabilmesi için açıyoruz. Alici dinlemeye başladı…

alici.Listen();
// Mesaj geldiğinde çalışacak olan eventi oluşturalım.
alici.MessageReceived += new EventHandler<System.Windows.Messaging.MessageReceivedEventArgs>(alici_MessageReceived);
}

void alici_MessageReceived(object sender, System.Windows.Messaging.MessageReceivedEventArgs e)
{

// Mesaj geldi, EventArgument’de Response isimli bir özellik var. Bu özellik mesajı gönderene bir yanıt gönderiyor.

e.Response = "Teşekkürler, Mesaj alındı !";

// EventArgument’in Message özelliği bize gönderilen mesajı veriyor.

tbAlici.Text = e.Message;

// EventArgument’in SenderDomain özelliği mesajı gönderen uygulamanın adresini veriyor.
// e.SenderDomain;

}
}
}

Şimdi uygulamalarımızı test edelim, iki uygulamayı da çalıştıralım.

Resim 1

Farklı browserlar da test edelim, Chrome’da mesajı gönderen uygulamayı çalıştıralım.

Resim 2

Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)

Sem GÖKSU
www.semgoksu.com | www.yazilimgunlugu.com
sem.goksu@yazilimgunlugu.com

Kaynaklar

msdn.com
silverlight.net