MehmetX.com

Windows Phone 7.1 MessageBox ve XNA MessageBox

8.11.2011 10:12:44 | Okunma Sayisi : 11357 | Yorum Sayisi : 0

Visual Studio 2010 ile yeni bir Windows Phone Application açalım. Örnek isim olarak wp_messageBox verdim.

Uygulama içerisinde 3 adet MessageBox inceleyeceğiz, bunlardan ikisi Windows Phone 7.1' de default olarak bulunan MessageBox.Show() ile gelen MessageBox' lar. Diğeri ise Microsoft.Xna.Framework.GamerServices namespace' i altındaki Guide.BeginShowMessageBox  metodu ile gelen MessageBox.

ContentPanel isimli Grid' in içerisine 3 adet Button ekleyelim ve aşağıdaki resimdeki gibi konumlandıralım.

Ekran Tasarımı


resim yuklenemedi
 

Bu ekran tasarımını hazırladıktan sonra her bir Button' a çift tıklayıp, Click event' lerini açalım. Click event' lerini de açtıktan sonra ContentPanel isimli Grid ve içerisindeki xaml kodları aşağıdaki gibi olmalı.

 

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Button Name="btnTek" 
                Content="Tek Butonlu" 
                Height="133"
                Width="438"
                HorizontalAlignment="Center" 
                VerticalAlignment="Top"
                Click="btnTek_Click"/>
            <Button Name="btnIki" 
                Content="İki Butonlu" 
                Height="133" 
                Width="438"
                HorizontalAlignment="Center" 
                VerticalAlignment="Center"
                Click="btnIki_Click"/>
            <Button Name="btnXna" 
                Content="XNA MessageBox" 
                Height="133" 
                Width="438"
                HorizontalAlignment="Center" 
                VerticalAlignment="Bottom"
                Click="btnXna_Click"/>
        </Grid>

MainPage.xaml.cs içerisindeki kodlar da aşağıdaki gibi olmalı.

 

namespace wp_messageBox
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }
 
        private void btnTek_Click(object sender, RoutedEventArgs e)
        {
 
        }
 
        private void btnIki_Click(object sender, RoutedEventArgs e)
        {
 
        }
 
        private void btnXna_Click(object sender, RoutedEventArgs e)
        {
 
        }
    }
}

btnTek_Click içerisindeki kodları aşağıdaki gibi düzenleyelim.

 

        private void btnTek_Click(object sender, RoutedEventArgs e)
        {
            MessageBoxResult sonuc = MessageBox.Show("Bu İlk MessageBox");
            if (sonuc == MessageBoxResult.OK)
                PageTitle.Text = "OK Seçtiniz";
        }

Windows Form' larda kullandığımız MessageBox class' ının Show metodu geriye DialogResult döndürürdü. Windows Phone' daki MessageBox class' ının Show metodu ise geriye MessageBoxResult tipinde bir enum döndürür.

MessageBoxResult


resim yuklenemedi
 

btnTek_Click içerisine yazdığımız kodların ne yaptıklarına bakacak olursak : 

  • MessageBox.Show() metodu ile içerisinde Bu İlk MessageBox yazan bir mesaj kutusu ekrana getirdik. Show metodundan dönen sonucu MessageBoxResult tipindeki sonuc değişkenine eşitledik.
  • IF ile, sonuc değişkeni MessageBoxResult' lardan OK' e eşitmidir diye baktık. 
  • Eğer eşit ise (yani ekrana gelen MessageBox' ın üzerindeki OK butonu tıklandıysa) PageTitle isimli TextBlock' un Text' ine OK Seçtiniz yazdırdık. PageTitle isimli TextBlock' u biz eklemedik. Windows Phone projesi açınca zaten gelen bir TextBlock' tur.

 

btnIki_Click içerisindeki kodları aşağıdaki gibi düzenleyelim.

 

        private void btnIki_Click(object sender, RoutedEventArgs e)
        {
            MessageBoxResult sonuc = MessageBox.Show(
                                                    "Bu İkinci MessageBox", 
                                                    "BAŞLIK", 
                                                    MessageBoxButton.OKCancel
                                                    );
            
            if (sonuc == MessageBoxResult.OK)
                PageTitle.Text = "OK Seçtiniz";
            else if(sonuc==MessageBoxResult.Cancel)
                PageTitle.Text = "CANCEL Seçtiniz";
        }

 

Windows Phone 7' de MessageBoxButton isimli enum' un içerisinde, aşağıdaki resimde de gördüğümüz gibi OK ve OKCancel seçenekleri bulunmaktadır.

MessageBoxButton


resim yuklenemedi
 

 

btnIki_Click içerisine yazdığımız kodların ne yaptıklarına bakacak olursak : 

  • MessageBox.Show' un overload' unu kullandık, yani içerisine 2 string ve 1 MessageBoxButton tipinde parametre alan overload' u. İlk parametre olarak verdiğimiz string, MessageBox' ın üzerinde görünecek olan metindir. İkinci parametre olarak verdiğimiz string MessageBox' ın yukarısında çıkacak olan başlıktır. Üçüncü parametre olarak verdiğimiz değer ise, MessageBox' ta görünecek olan Button' lardır. OKCancel seçtik, MessageBox' ta 2 adet Button olacak. Show metodundan dönen sonucu, yukarıdaki metotta yaptığımız gibi MessageBoxResult tipinde olan sonuc değişkenine eşitledik.
  • IF ile, sonuc değişkeni MessageBoxResult' lardan OK' e eşitmidir diye baktık. 
  • Eğer eşit ise PageTitle isimli TextBlock' un Text' ine OK Seçtiniz yazdırdık.
  • ELSE IF ile, sonuc değişkeni MessageBoxResult' lardan CANCEL' a eşitmidir diye baktık. 
  • Eğer eşit ise PageTitle isimli TextBlock' un Text' ine CANCEL Seçtiniz yazdırdık.

 

 

İkinci MessageBox' ı da tamamladık. Şimdi XNA MessageBox kullanımına geldi sıra.

 

Solution Explorer' da References' a sağ tıklayıp Add Reference seçelim. Gelen pencerede (aşağıdaki resimde göründüğü gibi) Microsoft.Xna.Framework.GamerServices seçelim.

Add Reference


resim yuklenemedi
 

Sağ alt köşedeki Add button' una tıkladıtkan sonra bu pencereyi kapatabiliriz.

Solution Explorer


resim yuklenemedi
 

Yukarıdaki resimde göründüğü gibi, Solution Explorer' da References altına bakarsak Microsoft.Xna.Framework.GamerServices referansı projeye eklenmiş durumdadır. 

Bu namespace altındaki Guide.BeginShowMessageBox() metodunu kullanacağız.

Öncelikle MainPage.xaml.cs' de sayfanın yukarısındaki using' lere gerekli olan namespace' i aşağıdaki gibi ekleyelim

 

using Microsoft.Xna.Framework.GamerServices;

 

ve btnXna_Click  içerisindeki kodları aşağıdaki gibi düzenleyelim.

 

        private void btnXna_Click(object sender, RoutedEventArgs e)
        {
            Guide.BeginShowMessageBox(
                                     "BAŞLIK",
                                     "Bu XNA MessageBox",
                                     new string[] { "Evet""Hayır" },
                                     0,
                                     MessageBoxIcon.Warning, 
                                     new AsyncCallback(sonucGeldi),
                                     null
                                     );
        }

Kodları bu şekilde yazdıktan sonra sonucGeldi' nin altı çizilecek ve Visual Studio The name 'sonucGeldi' does not exist in the current context diye bir hata verecektir. Bunun sebebi, henüz sonucGeldi metodunu yazmamamızdır. sonucGeldi metodunu aşağıdaki gibi yazalım ve ardından metotların neler yaptıklarını inceleyelim.

 

        void sonucGeldi(IAsyncResult ar)
        {
            int? seciliBtn = Guide.EndShowMessageBox(ar);
            switch (seciliBtn)
            {
                case 0:
                    Deployment.Current.Dispatcher.BeginInvoke(
                        () => PageTitle.Text = "Evet Seçtiniz");
                    break;
 
                case 1:
                    Deployment.Current.Dispatcher.BeginInvoke(
                        () => PageTitle.Text = "Hayır Seçtiniz");
                    break;
 
                default:
                    break;
            }
        }

Önce btnXna_Click içerisindeki kodların ne yaptıklarına bakalım : 

  • İçerisinde oyunlar ile ilgili metotların bulunduğu Guide class' ının BeginShowMessageBox metodunu kullandık. Bu metodun 2 kullanımı vardır yani 1 kere overload edilmiştir. Biz ilk kullanımını kullandık. İkinci kullanımı bundan farklı olarak bir player (oyuncu) index' i ister.
  • Metoda verdiğimiz ilk parametre string tipinde ve değeri Bu XNA MessageBox' tır. Bu değer MessageBox' ın başlığında görünecek olan değerdir.
  • Metoda verdiğimiz ikinci parametre de string tipinde ve değeri Var mısın?' dır. Bu değer de MessageBox' ta görünecek olan değerdir.
  • Metoda verdiğimiz üçüncü parametre ise string[] tipindedir ve MessageBox' ta görünecek olan Button' lardır. Windows Phone için en fazla 2 adet verilebilir, XBox 360 ve Windows için ise en fazla 3 adet verilebilir. Evet ve Hayır şeklinde 2 adet verdik.
  • Metoda verdiğimiz dördüncü parametre int tipinde ve değeri 0 (sıfır)' dır. MessageBox' taki Button' lardan hangisinin fokuslu olacağını belirtir. Button index' i verilir.
  • Metoda verdiğimiz beşinci parametre MessageBoxIcon tipindedir ve değeri Warning' dir. None haricindekiler MessageBox ekrana gelirken bir ses çıkartır ve hepsinde aynı ses çıkmaktadır.
  • Metoda verdiğimiz altıncı parametre ise bir delegate' dir (AsyncCallback). Bu delegate, ekrana gelen MessageBox' taki butonlardan biri tıklandıktan sonra çağrılacak olan metodu ister, biz de bu delegate' e sonucGeldi isimli metodu verdik. 
  • Metoda verdiğimiz yedinci (son) parametre object tipindedir ve null verdik. AsyncCallback' in çağıracağı metot içerisinde alınmak istenilen bir değer olacak ise, buraya bu değer verilebilir. Çağırlan metot içerisinde bu değer ar.AsyncState' ile alınabilir.

Ekrana gelen XNA MessageBox üzerindeki butonlardan biri tıklandığı zaman metoda verdiğimiz altıncı parametre (yani AsyncCallback delegate' i) sonucGeldi metodunu çağıracaktır. AsycnCallback delegate' i aşağıdaki resimde de görüleceği üzere, içerisine IAsyncResult tipinde parametre alan bir void  ister. 

Async Callback<

br /> resim yuklenemedi
 

Bu yüzden daha sonra yazdığımız sonucGeldi metodu void' dir ve parametre olarak IAsyncResult alır. 

sonucGeldi metodunun ne yaptığına bakacak olursak : 

  • Guide.EndShowMessageBox() metodundan dönen sonuç, XNA MessageBox' ta tıklanan butonun index' ini verir. (Evet button' u tıklandıysa 0, Hayır button' u tıklandıysa 1 verecektir).
  • Bu index' i switch' e aldık. 
  • 0 (sıfır) ise PageTitle isimli TextBlock' un Text' ine Evet Seçtiniz yazdırdık
  • 1 (bir) ise PageTitle isimli TextBlock' un Text' ine Hayır Seçtiniz yazdırdık
  • BeginInvoke metodu, içerisine belirttiğimiz delegate' i asenkron olarak çalıştırır. Yani içerisine verdiğimiz kodu PageTitle.Text= "Evet seçtiniz"; asenkron olarak çalıştıracak. Dispatcher.BeginInvoke kullanmayıp, case' lerin içerisinde doğrudan PageTitle.Text = "Evet Seçtiniz"; yazsaydık uygulamayı çalıştırınca Invalid cross-thread access hatası alacaktık. Farklı bir thread' den main thread içerisindeki bir kontrole (PageTitle) erişmeye çalıştığımızdan dolayı. 

Uygulamayı çalıştırıp sırasıyla button' lara tıklarsak her bir MessageBox' ı ekranın yukarısında göreceğiz. XNA MessageBox açılırken bir ses çıkaracaktır. 

Sırasıyla İlk MessageBox, İkinci MessageBox, XNA MessageBox


resim yuklenemedi resim yuklenemedi resim yuklenemedi
 

Ve her bir çıkan MessageBox üzerindeki buton(lar)dan herhangi birini tıklarsak MessageBox ekrandan gittikten sonra telefonun üstündeki PageTitle isimli TextBlock' ta,  MessageBox' ta yapılan seçim bilgisi yazacaktır.

Sonuçlar. Sırasıyla İlk MessageBox, İkinci MessageBox, XNA MessageBox

resim yuklenemedi resim yuklenemedi resim yuklenemedi
 

Örnek uygulamanın kaynak kodlarını buradan indirebilirsiniz.


0 Yorum




page-top