Kaynakça: TAŞDELEN Aykut, Bahçeşehir Üniversitesi, Windows Phone Programlama Dersi Notları
CSharp await async keyword ile Windows Phone MessageBox MessageDialog Kullanımı
Visual Studio 2015 güncellemesi sonrasında Windows Phone tarafında da birtakım değişiklikler yaşanmıştır. Sözgelimi mesaj kutusu diyaloğu görüntülemek için geçmişte MessageBox.Show() metodu kullanılırken bu güncelleme sonrasında MessageBox isimli sınıfın yerini MessageDialog sınıfına bıraktığı gözlemlenmektedir. En primitif haliyle bir mesaj kutusu diyaloğu aşağıdaki gibi görüntülenebilir:
// btnTest isimli bir düğmeye tıklandığı varsayılırsa
private async void btnTest_Click(object sender, RoutedEventArgs e)
{
MessageDialog dlg = new MessageDialog(“Kayıt gerçekleşti”, “CSD”);
var result = await dlg.ShowAsync();
}
Bu şekliyle üzerinde sadece başlık ve mesaj bir de varsayılan durumda Kapat yazan bir düğme ile mesaj kutusu görüntülenir.
Burada dikkat edilmesi gereken ayrıntı; ShowAsync() isimli metodun asenkron bir işlem yapıyor olması nedeniyle çağrımında await anahtar sözcüğünün kullanılmış olması, buna bağlı olarak da butona ait event handler’ın da async anahtar sözcüğü ile tanımlanmış olmasıdır.
await anahtar sözüğü; yapılmakta olan asenkron işlemin sonuna kadar beklenmesini sağlar. Bu anahtar sözcüğün kullanıldığı bir çağırma ifadesin yer aldığı fonksiyonlar ise async anahtar sözcüğü kullanılarak tanımlanmak zorundadırlar.
Şayet mesaj kutusu diyaloğu üzerine birden çok buton (en fazla 2 adete izin verilmiştir) eklenmek ve butonlara basılarak birtakım eylemler yaptırılmak istenilirse bu kez:
private async void btnTest_Click(object sender, RoutedEventArgs e)
{
MessageDialog dlg = new MessageDialog(“Kayıt gerçekleşti”, “CSD”);
dlg.Commands.Add(new UICommand() { Id = “1”, Label = “Kaydet”});
dlg.Commands.Add(new UICommand() { Id = “2”, Label = “Vazgeç” });
IUICommand cmd = await dlg.ShowAsync();
switch (cmd.Id.ToString())
{
case “1”:
grd.Background = new SolidColorBrush(Colors.Blue);
break;
case “2”:
grd.Background = new SolidColorBrush(Colors.Red);
break;
}
}
Bu örnekte; List<IUICommand> türündeki Commands isimli property’e IUICommand interface’ini implemente eden UICommand türünde iki adet nesne eklenmiş ve Label property’lerine atanan değerler ile butonların üzerindeki metinler belirlenmiş ayrıca Id olarak da “1 ve 2” değerleri kullanılmıştır.
ShowAsync() metodunun dönüş değeri kullanıcının hangi butona basarak diyaloğu kapattığı bilgisini temsil eder. Bu bağlamda örnekte dönüş değeri üzerinden Id’ye bakılarak hangi buton ile diyaloğu kapatıldığı anlaşılmakta ve ona göre sembolik bir işlem gerçekleştirilmektedir. Aynı şey farklı bir yöntem ile aşağıdaki gibi de yapılabilirdi:
private async void btnTest_Click(object sender, RoutedEventArgs e)
{
MessageDialog dlg = new MessageDialog(“Kayıt gerçekleşti”, “CSD”);
dlg.Commands.Add(new UICommand(“Kaydet”, new UICommandInvokedHandler(Save)));
dlg.Commands.Add(new UICommand(“Vazgeç”, new UICommandInvokedHandler(Cancel)));
await dlg.ShowAsync();
}
public void Save(IUICommand cmd)
{
grd.Background = new SolidColorBrush(Colors.Green);
}
public void Cancel(IUICommand cmd)
{
grd.Background = new SolidColorBrush(Colors.Yellow);
}