Yeni Başlat Butonu Göründü Gibi :)

Windows 8'in 8.1 güncellemesi ile birlikte geri geleceği söylenen başlat butonu göründü.

 

Geçtiğimiz yıl kullanıma sunulan Windows 8 kullanıcılar tarafından beğenilse de diğer Windows sürümlerinde alışılan Başlat menüsü Windows 8 de yoktu ve Microsoft'un kullanıcılar tarafından önemli eleştiri oklarına tutulmasına neden olmuştu.Son çıkan haberlere göre ise Microsoft bu eleştirilere bir cevap olarak Haziran ayında çıkarılması tahmin edilen Windows 8.1(Windows Blue) güncellemesi ile birlikte birçok eksiklik ve yeniliklerin yanında Başlat menüsünü de geri getireceği tahmin ediliyor.

 

Sızdırılan görüntüde Windows XP yada Windows 7'de alışık olmadğımız sade ve hoş bir tasarım olduğu dikkat çekiyor.

 

Windows Phone CMS'den Notification Gönderme

Toast Notifications uygulamadaki bir olaya bağlı olarak oluşturulan notification çeşididir. Örneğin RSS’ten veri çeken bir uygulama düşünüldüğünde yeni gelen bir kayıt için kullanıcıya haber vermek isteyebilirsiniz veya uygulamanızda mesajlaşma gibi özellikler varsa yeni mesajın  geldiğini bildirebilirsiniz. Bunların dışında haberler, hava durumu gibi birçok örnek verilebilir.

Senaryo şu şekilde işliyor;

Uygulama işletim sistemine "Bana birisi Toast Notification yollayacak.." diyor ve işletim sistemi sonrasında Microsoft'un Push Notification Server'ına bağlanıyor ve diyor ki "Sana benim uygulamam için bir notification yollanacak nereye yollansın ?" Telefonun işletim sistemi uygulamaya bir Endpoint atıyor ve işletim sistemi diyor ki "Bu endpoint'e Notification gönderilirse ben onu senin adına göstericem".Sonrasında uygulama bu endpoint'i alıp kendi local server'ına "Bu ID'li cihaz için şu endpoint'e mesaj yollarsan görünecektir." diyor ve gönderilen mesaj uygulama ekranında görünüyor.

 

 

  • Aşağıdaki örnek uygulama bir Asp.Net sayfasından Windows Phone uygulamasına nasıl Toast Message gönderilir açıklıyor olacaktır

 

Window Phone Projesi. MainPage.xaml sayfası

 

HttpNotificationChannel Channel;  //Global değişkenimiz

public MainPage()

{

InitializeComponent();

 

Channel = HttpNotificationChannel.Find("Find"); //Kayıtlı kanal var mı kontrolünün yapıldığı yer

if (Channel == null)

{

Channel = newHttpNotificationChannel("Kanal");

 

//Kullanacağımız eventleri oluşturuyoruz

Channel.ChannelUriUpdated += Channel_ChannelUriUpdated;

 

Channel.ShellToastNotificationReceived +=

Channel_ShellToastNotificationReceived;

 

Channel.Open();

Channel.BindToShellToast();

}

}

void Channel_ShellToastNotificationReceived(object sender, NotificationEventArgs e)

{

StringBuilder message = newStringBuilder();

string relativeUri = string.Empty;

 

message.AppendFormat("Received Toast {0}:\n", DateTime.Now.ToShortTimeString());

 

 

foreach (string key in e.Collection.Keys)

{

message.AppendFormat("{0}: {1}\n", key, e.Collection[key]);

 

if(string.Compare(key,"wp:Param",System.Globalization.CultureInfo.InvariantCulture,

System.Globalization.CompareOptions.IgnoreCase) == 0)

{

relativeUri = e.Collection[key];

}

}

 

// Toast mesajı için ekranda dialog çıkartır

Dispatcher.BeginInvoke(() => MessageBox.Show(message.ToString()));

}

 

 

 

void Channel_ChannelUriUpdated(object sender, NotificationChannelUriEventArgs e)

{

Dispatcher.BeginInvoke(() =>

{

System.Diagnostics.Debug.WriteLine(e.ChannelUri.ToString());

MessageBox.Show(String.Format("Channel Uri is {0}",

e.ChannelUri.ToString()));

 

});

 

}

 

 

Toast mesajının gönderileceği Asp.Net Projesi

Gonder.aspx Design sayfası

 

<htmlxmlns="http://www.w3.org/1999/xhtml">

<headid="Head1"runat="server">

    <title></title>

</head>

<body>

    <formid="form1"runat="server">

        <div>

 

            <br/>

            Enter URI:

        </div>

        <asp:TextBoxID="TextBoxUri"runat="server"Width="666px"></asp:TextBox>

        <br/>

        <br/>

        Enter Title:<br/>

        <asp:TextBoxID="TextBoxTitle"runat="server"></asp:TextBox>

        <br/>

        <br/>

        Enter Subtitle:<br/>

        <asp:TextBoxID="TextBoxSubTitle"runat="server"></asp:TextBox>

        <br/>

        <br/>

        <br/>

        <asp:ButtonID="ButtonSendToast"runat="server"OnClick="ButtonSendToast_Click"

            Text="Send Toast Notification"/>

        <br/>

        <br/>

        Response:<br/>

        <asp:TextBoxID="TextBoxResponse"runat="server"Height="78px"Width="199px"></asp:TextBox>

    </form>

</body>

 

</html>

 

 

Gonder.aspx Code Behind

    protectedvoid ButtonSendToast_Click(object sender, EventArgs e)

        {

            try

            {

                string subscriptionUri = TextBoxUri.Text.ToString();

 

 

                HttpWebRequest sendNotificationRequest = (HttpWebRequest)WebRequest.Create(subscriptionUri);

                sendNotificationRequest.Method = "POST";

 

                string toastMessage = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +

                "<wp:Notification xmlns:wp=\"WPNotification\">" +

                   "<wp:Toast>" +

                        "<wp:Text1>" + TextBoxTitle.Text.ToString() + "</wp:Text1>" +

                        "<wp:Text2>" + TextBoxSubTitle.Text.ToString() + "</wp:Text2>" +

                        "<wp:Param>/Page2.xaml?NavigatedFrom=Toast Notification</wp:Param>" +

                   "</wp:Toast> " +

                "</wp:Notification>";

 

                byte[] notificationMessage = Encoding.Default.GetBytes(toastMessage);

 

                sendNotificationRequest.ContentLength = notificationMessage.Length;

                sendNotificationRequest.ContentType = "text/xml";

                sendNotificationRequest.Headers.Add("X-WindowsPhone-Target", "toast");

                sendNotificationRequest.Headers.Add("X-NotificationClass", "2");

 

 

                using (Stream requestStream = sendNotificationRequest.GetRequestStream())

                {

                    requestStream.Write(notificationMessage, 0, notificationMessage.Length);

                }

 

               

                HttpWebResponse response = (HttpWebResponse)sendNotificationRequest.GetResponse();

                string notificationStatus = response.Headers["X-NotificationStatus"];

                string notificationChannelStatus = response.Headers["X-SubscriptionStatus"];

                string deviceConnectionStatus = response.Headers["X-DeviceConnectionStatus"];

 

                TextBoxResponse.Text = notificationStatus + " | " + deviceConnectionStatus + " | " + notificationChannelStatus;

            }

            catch (Exception ex)

            {

                TextBoxResponse.Text = "Exception caught sending update: " + ex.ToString();

            }

        }

 

 

İlk olarak Client’ı yani WinPhone projemizi çalıştırıyoruz VisualStudio’da bulunan Output sayfasında uygulamamazın oluşturduğu URL'i aşağıda olduğu şekilde alıyoruz

 

Sonrasında Server tarafını yani Asp.Net projemizi çalıştırıyoruz Gerekli yerleri doldurup Send Toas Notification butonuna tıklıyoruz ve göndermiş olduğumuz mesaj Windows Phone Uygulamamızda resimde olduğu gibi görünüyor.

 

Uygulamanın kaynak kodlarını buradan indirebilirsiniz. 

 

Windows Phone Uygulamasında İnternet Kontrol Etme

Windows Phone’da içerisinde internet kullanımı gerektiren bir uygulama geliştirdiğimizde uygulama içerisinde sürekli olarak internet var mı ?  yok mu ? diye kontrol etmek zorundayız. İster uygulama ilk açıldığında Page_Load anında bunu yapabilir istersekde uygulama içerisinde bir Buton’a tıklanıldığında.Aşağıda internet olduğunda True olmadığında False değer dönen CheckConnection() metod’unu uygulamalarda kullanabiliriz.

publicbool CheckConnection()

{

    if ((Microsoft.Phone.Net.NetworkInformation.NetworkInterface.NetworkInterfaceType ==        

 Microsoft.Phone.Net.NetworkInformation.NetworkInterfaceType.None))

           return false;       

        else    

           return true;      

}

Windows Phone Splash Screen Ekleme

Windows Phone projelerinde uygulama açılırken SplashScreen dediğimiz açılış sayfalarını thread kullanarak ekleyebiliyoruz. Bunun için bir adet WindowsPhone projesi oluşturuyoruz ve içerisine MainPage.xaml sayfasından başka 1 adet adı SplashScreen olan portrait page ekliyoruz ve sonrasında aşağıdaki kodları sayfalarımıza ekliyoruz.

SplashScreen.xaml Design Sayfası

<Grid x:Name="LayoutRoot" Background="White" Width="480" Height="900">

<ProgressBar HorizontalAlignment="Left" Margin="49,712,0,149" Name="progressBar1" Width="383" />

<Image Height="666" HorizontalAlignment="Left" Margin="0,0,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="480" Source="SplashScreenImage.png" />

<TextBlock HorizontalAlignment="Left" Margin="151,671,0,193" Name="textBlock1" Text="Lütfen Bekleyiniz..." Width="173" Foreground="Black" FontSize="22" />

</Grid>

SplashScreen.xaml Code Behind

publicpartialclassSplashScreen : PhoneApplicationPage

{

public SplashScreen()

{

InitializeComponent();

this.progressBar1.IsIndeterminate = true//Progressbar’ın çalışmasını söyledik

}

}

 

MainPage.xaml Code Behind

//Metod içerisinde kullanmak için Global değişkenleri tanımlıyoruz

privatePopup popup;

privateBackgroundWorker backroungWorker;

public PrayerTime()

{

InitializeComponent();

ShowSplash(); //SplashScreen metodunu çağırıyoruz

}

privatevoid ShowSplash()

{

this.popup = newPopup();

this.popup.Child = newSplashScreen();

this.popup.IsOpen = true;

StartLoadingData();

}

 

privatevoid StartLoadingData()

{

backroungWorker = newBackgroundWorker();

backroungWorker.DoWork += newDoWorkEventHandler(backroungWorker_DoWork);

backroungWorker.RunWorkerCompleted += newRunWorkerCompletedEventHandler(backroungWorker_RunWorkerCompleted);

backroungWorker.RunWorkerAsync();

}

 

 

void backroungWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)

{

this.Dispatcher.BeginInvoke(() =>

{

this.popup.IsOpen = false;

 

}

);

 

}

 

void backroungWorker_DoWork(object sender, DoWorkEventArgs e)

{

Thread.Sleep(1000); //Splash screen sayfasının ne kadar süre ile ekranda kalacağını belirtiyoruz

}

 

Kodları hatasız yazdıktan sonra uygulamamızı çalıştırdığımızda ekran çıktısı aşağıdaki gibi olacaktır.

 

Windows Phone LightBox(Canvas) Kullanımı

 

Web’de alışık olduğumuz Lightbox’ları Windows Phone’da da bi nevi yapmak mümkün. Nasıl mı ? Canvas kontrolünü kullanarak.

İlk olarka yeni bir WP projesi açalım ve MainPage.xaml design sayfası içerisindeki Grid’in içine 1 adet Canvas kontrolü atalım Canvas tagleri içine StackPanel ve StackPanel’inde içine istediğimiz kontrolleri atalım  TextBox,TextBlock, Buton etc. Canvas’ın Visibility=" "  özelliğini kullanarak tıpkı bir Lightbox gibi çalışmasını sağlayabilriz. Ekranda görünsün istediğimizde Visibility="Visible"diyebilir, görünmesin istediğimizde Visibility=" Collapsed"yaparak ekrandan kaybolmasını sağlayabiliriz.

Yaklaşık 3 ay önce geliştirdiğim ve şuan markette bulunan SonDepremler uygulaması için kullandığım Canvas kontrolünün kodları aşağıda olduğu gibidir.

LightBox’ın ekranda görünmesi için ekranda bulunana herhangi bir kontrol’ün event’i tetiklendiğinde tek yapmanız gereken metod içerisine canvasfiltre.Vi ibility=Visible; demek

Ekrandan kaybolması için ise Canvas içerisinde bulunan canvasclose butonunun Click eventinin metoduna canvasfiltre.Visibility=Visibility.Collapsed; demek yeterli olacaktır.

Mainpage.xaml Design Sayfası

 

<Canvas Canvas.ZIndex="1" Visibility="Visible" x:Name="canvasfiltre" Width="400" Background="White" Height="480">
 
                <StackPanel Width="400">
                    <HyperlinkButton x:Name="canvasclose" Foreground="#d64300" HorizontalAlignment="Right" Content="X" FontWeight="Bold" Canvas.Left="400" Canvas.Top="10" Click="canvasclose_Click" />
                    <StackPanel Orientation="Vertical">
                        <TextBlock TextWrapping="Wrap" FontSize="45" FontWeight="Bold" Foreground="#d64300" VerticalAlignment="Top" Text="Sırala" HorizontalAlignment="Center" TextDecorations="Underline"/>
                        <CheckBox IsChecked="true" Name="chctumdepremler" FontWeight="Bold" FontSize="26" Foreground="#d64300" Background="Red" Content="Tüm Depremler" Click="chctumdepremler_Click"/>
                        <CheckBox Name="chc_3alti" HorizontalAlignment="Left" Content="Şiddeti 3'ten az olanlar" FontSize="26" Background="Red" Foreground="#d64300" FontWeight="Bold" Click="chc_3alti_Click"/>
                        <CheckBox Name="chc_3ustu" HorizontalAlignment="Left" Content="Şiddeti 3'ten fazla olanlar" Background="Red" FontSize="26" Foreground="#d64300" FontWeight="Bold" Click="chc_3ustu_Click"/>
                        <CheckBox Name="chc_5alti" HorizontalAlignment="Left" Content="Şiddeti 5'ten az olanlar" FontSize="26" Background="Red" Foreground="#d64300" FontWeight="Bold" Click="chc_5alti_Click"/>
                        <CheckBox Name="chc_5ustu" HorizontalAlignment="Left" Content="Şiddeti 5'ten fazla olanlar" Background="Red" FontSize="26" Foreground="#d64300" FontWeight="Bold" Click="chc_5ustu_Click"/>
                    </StackPanel>
                </StackPanel>
            </Canvas>