Yazgeliştir Windows 8 Uygulaması

Yazgeliştir  ekibi olarak okuyucularımızın birçok farklı platformdan veriye erişebilmesi hedefimizi yerine getirmek için attığımız adımlardan biri olan Yazgeliştir Windows 8 uygulaması yayında. Windows 8 kullanan tüm kullanıcılarımız Windows 8 Mağaza’dan uygulamamızı bilgisayarlarına kurabilirler.

Yazgeliştir Windows 8 uygulaması ile aşağıdaki işlemleri yapabilirsiniz;

Makale Okuma

  • İpucu Okuma
  • Haberleri Duyuruları Takip Etme
  • Etkinlikleri Takip Etme
  • İş İlanlarını Takip Etme
  • Makaleye Puan Verme
  • Favori Makaleler
  • Etkinliklere Katılma
  • Kullanıcı İşlemleri

Uygulama hakkında daha fazla bilgi almak için http://bit.ly/TsRqTA adresini ziyaret edebilirsiniz.

Visual Studio 2012 sanal lansmanı

Microsoft Visual Studio 2012
sanal lansmanında konuğumuz olun.
Visual Studio 2012 lansman canlı yayın 12 Eylül 2012′de
saat 19:30′da
Visual Studio 2012′nin yeni özelliklerinin hepsini nerede olursanız olun deneyin. Takviminize hatırlatma eklemek için Visual Studio Lansman sitesini ziyaret edin. Sizi Eylül’de aramızda görmeyi dört gözle bekliyoruz.
Lansman bana neler katacak? :
Yeni ve güçlü özellikleri
deneyin.

Visual Studio 2012′nin sizi nasıl daha çevikleştirdiğini ve takım çalışmasına yaptığı olumlu katkıları keşfedin. Uygulama Geliştirmede en iyi örnekleri nasıl bir araya getirdiğini görün.
Uygulama Yaşam Döngüsünde
her ana değer katın.

Stratejiden planlamaya, Visual Studio’nun uygulama yaşam döngüsüne nasıl sürekli değer kattığını görün.
Orada olun. İlham alın.Visual Studio 2012 lansmanını kaçırmayın.

Tarihi şimdiden not edin.

 

4 – 5 Eylül Tech Days – Windows 8 Uygulama Geliştirme Kampı

Sizi,4-5 Eylül 2012 tarihlerinde İstanbul ofisimizde gerçekleştireceğimiz Windows 8 için Uygulama Geliştirme Kamp’ına davet ediyoruz.

2 tam gün sürecek olan Workshop’a katılımınız ve geliştireceğiniz uygulamanız ile birlikte Windows 8 Uygulama Mağazasında ilk yer alan uygulamalardan birisi olma şansını da elde ediyor olacaksınız.

Eğer https://www.acikakademi.com/windows8/ adresinden Windows 8 eğitimlerini aldıysanız ve uygulama geliştirmeye başladıysanız gelin uygulamanızı beraber test edelim ve Uygulama Mağazası’na yüklemeye hazır hale getirelim.

Kampımız 150 kişi ile sınırlıdır. Yerinizi ayırtmak için hemen kayıt yaptırın!

 

Workshop Amaçları

Bu workshopta, Windows’u nasıl yeni baştan tasarladığımızı sizlerle tartışmak ve yeni platformun geliştirme bilgilerini de birinci ağızdan aktarmayı hedefliyoruz.

Windows takımı tarafından yönetilen workshop’lar geliştiricilerinize aşağıdaki konularda yardımcı olmaları için tasarlandı:

  1. Windows 8 platformunu nelerin farklı kıldığını öğrenme
  2. Önemli Windows 8 konseptlerine detaylı teknik bir inceleme yapma
  3. Windows 8 uygulama geliştirme üzerine uygulamalı olarak deneyim aktarma

Katılımcıların, workshoptan Windows 8 platformu hakkında net bilgilerle ve uygulamalarını hemen geliştirmeye hazır bir bilgi birikimi ile ayrılmaları amaçlanmaktadır.

Workshop İçeriği

• İlk gün, Windows Azure’ un arkaplanda yeraldığı bir uygulama Windows 8 ve Windows Phone için birlikte tasarlanarak örneklerle geliştirilecektir.
• İkinci gün ise tamamen ilk gün anlatılan konularla kendi uygulamalarınzı danışman eşliğinde geliştiriyor olacak ve geliştirme adımında en doğru yöntemleri kendi uygulamalarınız üzerinde gerçekleştirme şansı bulacaksınız.

Yer ve Tarih Bilgileri

Tarih 4-5 Eylül 2012, 2 Tam gün.
Yer Microsoft Türkiye İstanbul Ofisi
Aydın Sok. No:7 Bellevue Residence Levent 34340
Kayıt İçin Sadece kayıtlı geliştiriciler katılabilecektir.
Ücretsiz kayıt olmak için tıklayınız.
Workshop Dili ve Gereksinimler Türkçe // etkinlik teknik detaylı ve uygulamalı bir etkinlik olacağı için katılımcının en az bir programlama dili (JS, C#, VB, C++) bilmesi gereklidir.

 

Hazırlık

Windows Dev Center daki Windows 8 style app development sayfalarını inceleyerek geliştirme için gerekli SDK ve Araçları indirerek hızlı bir başlangıç yapabilirsiniz.

Window 8 RTM tarihi belli oldu

Windows 8′in RTM (Release to Manufacturing) sürümü Ağustos ayının ilk haftasında üreticilere sunulacak. Windows 8 ve Windows RT’li cihazların piyasaya sürüm tarihi ise Ekim ayının sonu olarak açıklandı.

Konuyla ilgili detaylı bilgiye Microsoft Türkiye blog’undan ulaşabilirsiniz:

http://blog.microsoft.com.tr/windows-8-rtm-tarihi-belli-oldu.html

Windows 8 MetroStyle JavaScript DatePicker, Rating ve Toggle Switch Kontrolleri

Makale serimde şu ana kadar JavaScript ile Windows 8 Metro Style uygulama geliştirmek için gerekli olan birçok kontrolü inceledik. Bu makalemde ise geri kalan ufak kontrolleri topluca incelemeye çalışacağız.

Bu kontroller DatePicker, Rating ve Toggle Switch kontrolleridir. Tüm kontroller için anlatımı ayrı ayrı yaptıktan sonra tek bir örnek içerisinde hepsinin demosunu yapacağız.

DatePicker Kontrolü

Adından da anlaşılacağı üzere bu kontrol kullanıcıya tarih seçtirmek için kullanılır. Bu kontrolü kullanmak için bir div oluşturup data-win-control özelliğine WinJS.UI.DatePicker değerini vermeniz gerekmektedir. İsterseniz şimdi bu kontrolün özelliklerini inceleyelim.

OnChange: DatePicker’ın seçili tarihi değiştirildiğinde fırlatılacak eventtir.
Current: DatePicker kontrolünde seçili olan değeri almaya veya bir değeri seçmeye yarar.
DatePattern: Tarihin gösterileceği formatı taşıyan özelliktir.
Disabled: Kontrolün enable dolup olmadığının belirlendiği özelliktir.
MaxYear: Seçilebilecek en büyük yıl değerini okuyabileceğimiz veya değiştirebileceğimiz özelliktir.
MinYear: Seçilebilecek en küçük yıl değerini okuyabileceğimiz veya değiştirebileceğimiz özelliktir.

Bu özellikleri gerek JavaScript kodundan gerek ise json nesnesi olarak data-win-options özelliğine vererek kontrolünüzü özelleştirebilirsiniz.

Rating Kontrolü

Rating kontrolü belirli bir içeriği veya bir nesneyi değerlendirmek için kullanabileceğiniz bir kontroldür. Temel olarak kaç puan vermek istiyorsanız o kadar yıldız seçmenize bakar. Bu kontrolü kullanmak için bir div oluşturup data-win-control özelliğine WinJS.UI.Rating değerini vermeniz gerekmektedir. İsterseniz şimdi bu kontrolün özelliklerini inceleyelim:

OnChange: Kullanıcının rating kontrolü üzerindeki seçimini değiştirdiği zaman fırlatılacak event’tir.
AverageRating: Ortalama puanın okunduğu veya belirlendiği özelliktir. Ortalama puan farklı bir renkte yıldızlar üzerinde gösterilecektir.
Disabled: Kontrolün enable dolup olmadığının belirlendiği özelliktir.
MaxRating: En fazla kaç puan verilebileceğinin belirlendiği özelliktir.
UserRating: Kullanıcının kaç puan verdiğinin okunması veya kullanıcının puan vermesi için kullanılan özelliktir.

Bu özellikleri gerek JavaScript kodundan gerek ise json nesnesi olarak data-win-options özelliğine vererek kontrolünüzü özelleştirebilirsiniz.

Toggle Switch Kontrolü

Toggle switch kontrolü genellikle bir özelliğin açık veya kapalı veya iki farklı durumdan hangisinde olduğunu belirlemek için kullanılan bir kontroldür. Bu kontrolü kullanmak için bir div oluşturup data-win-control özelliğine WinJS.UI.ToggleSwitch değerini vermeniz gerekmektedir. İsterseniz şimdi bu kontrolün özelliklerini inceleyelim:

OnChange: Kullanıcının rating kontrolü üzerindeki seçimini değiştirdiği zaman fırlatılacak event’tir.
Checked: Kontrolün on veya off durumunda olduğunun okunabildiği veya programatik olarak belirlenebildiği özelliktir.
Disabled: Kontrolün enable dolup olmadığının belirlendiği özelliktir.
LabelOff: Kontrolün off olduğu durumda yazacak olan değerdir.
LabelOn: Kontrolün on olduğu durumda yazacak olan değerdir.
Title: Her durumda kontrolün başında yazacak olan metindir.

Bu özellikleri gerek JavaScript kodundan gerek ise json nesnesi olarak data-win-options özelliğine vererek kontrolünüzü özelleştirebilirsiniz.

Şimdi isterseniz bu tüm özelliklerin demosunu kontrollerimize bu özelliklerin bazılarını atayarak yapalım.

HTML kodumuz aşağıdaki gibi olacaktır.

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>JavaScriptControls</title>

    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.1.0.RC/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.1.0.RC/js/base.js"></script>
    <script src="//Microsoft.WinJS.1.0.RC/js/ui.js"></script>

    <!-- JavaScriptControls references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
</head>
<body>
     <label>Doğum Tarihi</label>
    <div id="dp" data-win-control="WinJS.UI.DatePicker" data-win-options="{minYear:2011,maxYear:2015}"></div>
    <br /><br />
    <label>Puan</label>
    <div id="r" data-win-control="WinJS.UI.Rating" data-win-options="{maxRating:5,averageRating:5,userRating:3}"></div>
    <br /><br />
    <label>Memnun Kaldı mı?</label>
    <div id="ts" data-win-control="WinJS.UI.ToggleSwitch" data-win-options="{labelOff:'Hayır',labelOn:'Evet'}"></div>
</body>
</html>

Ekran görüntümüz ise aşağıdaki gibi olacaktır:

Örnek Kodlar

Açık Akademi Windows 8 eğitimi

Açık Akademi’deki Windows 8 için uygulama geliştirme hakkında faydalı bulacağınıza inandığım eğitimi sizlerle paylaşmak istiyorum.

http://www.acikakademi.com/windows8/

 

Windows 8 MetroStyle FlipView Kontrolü (JavaScript ve C#)

Bu makalemde sizlere Windows 8 Metro Style uygulama geliştirmede FlipView kontrolünün kullanımından bahsedeceğim.

Flipview kontrolü sahip olduğu her nesneyi tam ekran olarak gösterir ve nesneler arası geçiş ekranın sağında ve solunda çıkan oklar veya dokunmatik ekranda dokunmatik olarak yapılır.

FlipView’in en güzel kullanıldığı alanlardan biri Internet Explorer’ın ileri ve geri butonlarının kullanımıdır. Aynı zamanda fotoğraf albümündeki fotoğraflar arasında dolaşmak üzere tasarlanmış halini birçok uygulamada görmemiz olasıdır.

 

Öncelikle HTML/JavaScript uygulamalarında FlipView’i nasıl kullanacağımızı inceleyelim;

FlipView kullanım bakımından listview’e çok benzer temel olarak bir ItemTemplate oluşturup bu Template’in FlipView’e atanması ve ardından FlipView’in datasource’una göstermek istediğimiz nesnelerin atanması şeklinde kodumuzu yazarız.

Örnek kodumuzu yazmadan önce isterseniz FlipView’in belli başlı özelliklerine bir göz atalım.

Event’ler
Datasourcechanged: Bu event FlipView kontrolünün datasource’u değiştiğinde tetiklenir.
PageCompleted: Bu event FlipView yeni bir sayfaya geçtiğinde ve o sayfanın render edilmesi tamamlandığında fırlatılır.
PageSelected: Bu event FlipView yeni bir sayfaya geçer geçmez çalıştırılır.
PageVisibilityChanged: Bu event bir sayfanın görünürlüğü değiştiğinde fırlatılır.

Metod’lar
Count(): FlipView içerisinde kaç nesne olduğunu döndürür.
Next(): Bir sonraki sayfaya programatik olarak geçmemizi sağlayan metoddur.
Previous(): Bir önceki sayfaya programatik olarak geçmemizi sağlayan metoddur.

Property’ler
CurrentPage: Mevcut sayfanın index’ini okuyabileceğimiz veya belirleyebileceğimiz özelliktir.
ItemDataSource: FlipView’e datasource olarak nesneleri verebileceğimiz özelliktir.
ItemSpacing: Nesneler arası boşluğu belirleyen özelliktir.
Itemtemplate: ItemDataSource da verilmiş her bir nesnenin ne şekilde render edileceğinin belirlendiği özelliktir. Sayfa üzerinde bir WinJS.Binding.Template kontrolünü verebilirsiniz.
Orientation: FlipView’in yatay mı dikey mi gösterileceğinin belirlendiği özelliktir.

Şimdi isterseniz ufak bir örnek yapalım.

HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>FlipViewJavaScript</title>

    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.1.0.RC/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.1.0.RC/js/base.js"></script>
    <script src="//Microsoft.WinJS.1.0.RC/js/ui.js"></script>

    <!-- FlipViewJavaScript references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
</head>
<body>
    <div id="template" data-win-control="WinJS.Binding.Template">
        <img data-win-bind="src:image"/>
        <br /><br />
        <div data-win-bind="innerText:name"></div>
    </div>
    <div id="flip" data-win-control="WinJS.UI.FlipView" data-win-options="{itemTemplate:select('#template')}"></div>
</body>
</html>

JavaScript

// For an introduction to the Blank template, see the following documentation:
// http://go.microsoft.com/fwlink/?LinkId=232509
(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    WinJS.strictProcessing();

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                // TODO: This application has been newly launched. Initialize
                // your application here.
            } else {
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }
            args.setPromise(WinJS.UI.processAll());
            loaded();
        }
    };

    function loaded() {
        var usersArray = [
           { image: '/images/user/1.jpg', name: 'Ayşe1' },
           { image: '/images/user/2.jpg', name: 'Ali1' },
           { image: '/images/user/3.jpg', name: 'Ahmet1' },
           { image: '/images/user/4.png', name: 'Mehmet1' },
           { image: '/images/user/5.png', name: 'Mustafa1' },
            { image: '/images/user/1.jpg', name: 'Ayşe2' },
           { image: '/images/user/2.jpg', name: 'Ali2' },
           { image: '/images/user/3.jpg', name: 'Ahmet2' },
           { image: '/images/user/4.png', name: 'Mehmet2' },
           { image: '/images/user/5.png', name: 'Mustafa2' },
        ]

        var dataList = new WinJS.Binding.List(usersArray);

        var flp = document.getElementById('flip').winControl;
        flp.itemDataSource = dataList.dataSource;
    }

    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. You might use the
        // WinJS.Application.sessionState object, which is automatically
        // saved and restored across suspension. If you need to complete an
        // asynchronous operation before your application is suspended, call
        // args.setPromise().
    };

    app.start();
})();

Uygulamamızın ekran görüntüsü aşağıdaki gibi olacaktır:

Şimdi ise XAML/C# tarafında FlipView kontrolünü inceleyelim.

XAML tarafına baktığınızda FlipView’in temel özellikleri çok benzerlik gösterse de çok daha fazla event, metod veya property ile karşılaşacaksınız.

Genel olarak kullanım mantığında ise hiçbir değişiklik yok. Önce sayfamızın üzerine FlipView kontrolünü sürükleyerek bırakıyoruz. Sonrasında FlipView kontrolümüze sağ tıklıyoruz ve Edit Additional Templates menüsünden ItemTemplate’i seçiyor ve daha sonra Create Empty diyoruz. Oluşturmuş olduğumuz bu ItemTemplate içerisinde her türlü kontrolü kullanmamız mümkün. Bir kontrolün bir özelliğine değer atamak istiyorsak ise Binding keyword’ünü kullanıyoruz. Örneğin bir TextBlock’un Text özelliğine datasource’da bulunan nesnenin bir özelliğini atamak istiyorsak syntax’ımız şu şekilde oluyor. Text={Binding PropertyAdi}.

İsterseniz şimdi bir örnek yaparak makalemizi sonlandıralım.

XAML

<Page
    x:Class="FlipViewXAML.MainPage"
    IsTabStop="false"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:FlipViewXAML"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">
    <Page.Resources>
        <DataTemplate x:Key="DataTemplate1">
            <Grid>
                <Image Source="{Binding image}"></Image>
                <TextBlock Text="{Binding name}"></TextBlock>
            </Grid>
        </DataTemplate>
    </Page.Resources>

    <Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
        <FlipView x:Name="flip" HorizontalAlignment="Left"  Height="768" VerticalAlignment="Top" ItemTemplate="{StaticResource DataTemplate1}"/>

    </Grid>
</Page>

C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238

namespace FlipViewXAML
{
    /// <summary>
    /// An empty page that can be used on its own or navigated to within a Frame.
    /// </summary>
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        /// <summary>
        /// Invoked when this page is about to be displayed in a Frame.
        /// </summary>
        /// <param name="e">Event data that describes how this page was reached.  The Parameter
        /// property is typically used to configure the page.</param>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            List<User> insList = new List<User>();
            insList.Add(new User { name = "Ayşe", image = "Assets/user/1.jpg" });
            insList.Add(new User { name = "Ali", image = "Assets/user/2.jpg" });
            insList.Add(new User { name = "Ahmet", image = "Assets/user/3.jpg" });
            flip.ItemsSource = insList;
        }
    }
    public class User
    {
        public string name { get; set; }
        public string image { get; set; }
    }
}

Ekran görüntümüze bakacak olursak:

JavaScript Örnek Kodlar

XAML Örnek Kodlar

Windows 8 MetroStyle JavaScript ListView Kontrolü

Bu makalemde sizlere Windows 8 Metro Style uygulama geliştirmede JavaScript yaklaşımını kullandığımızda DataBinding ile çalışmanız gerektiğinde birçok yerde kullanacağınız ListView kontrolünden bahsedeceğim.

Listview kontrolü genel olarak bir datasource’da bulunan nesneleri listelemekte kullanılır. Temel olarak gösterimi iki farklı şekilde olabilir. Bunlar GirdLayout ve ListLayout’dur. GridLayout Windows 8 başlangıç ekranındaki gibi bir görünüm sunarken ListLayout nesnelerin alt alta listelenmesi şeklinde bir görünüm sunar.

Her iki görünümde de oluşturulacak nesneler için ItemTemplate kontrolünün kullanılması gerekmektedir. Şimdi isterseniz örnek bir Listview koduna ve ItemTemplate koduna bakalım, ardından ise Listview’in özelliklerini incelemeye devam edelim.

<div id="listUsers" data-win-control="WinJS.UI.ListView"></div>

Listview kullandığımız her zaman datasource’da bulunan her nesnenin ekrana render edilmesi gerekmektedir. Bu render işleminin nesne başına nasıl olacağını belirlenmesi için ItemTemplate kullanılması gerekmektedir. ItemView’i ise aşağıdaki gibi oluşturabiliriz. Gördüğünüz gibi div’imizin data-win-control özelliğine WinJS.Binding.Template tipini veriyoruz. Bu kontrolün içerisinde ise istediğimiz kontrolü kullanabiliyoruz. Datasource’da bulunan her nesne için render edilecek kontroller de bunlar olacaktır. Kullandığımız bu kontrollerin özelliklerine datasource’umuzdaki özellikleri atamak için data-win-bind özelliğini kullanıyoruz. Bu özelliğin içerisine kullandığımız kontrolün hangi özelliğine datasource’daki hangi özelliğin atanacağını kontrolözelliği:DataSourceÖzelliği şeklinde atıyoruz.

< div id="itemTemplateUsers" data-win-control="WinJS.Binding.Template">
    <div style="margin:5px">
        <img data-win-bind="src:UserImage" style="width:150px;height:150px" />
        <div data-win-bind="innerText:UserName" style="text-align:center"></div>
    </div>
</div>

Şimdi ise oluşturmuş olduğumuz bu ItemTemplate’in ListView tarafından kullanılmasını sağlamak gerekiyor. Bunun için ListView kontrolümüzün data-win-options özelliğine oluşturacağımız json nesnesi ile bu tanımlamayı yapmamız gerekiyor. Bu tanımlamayı aşağıdaki gibi yapabiliyoruz. ListView’in itemRenderer özelliğine oluşturmuş olduğumuz ItemTemplate’in id’sini vererek bu işlemi yapıyoruz. Bu sayede listview içerisinde oluşturulacak her nesne için itemTemplateUsers div’inin render edilmesini sağlıyoruz.

<div id="listUsers" data-win-control="WinJS.UI.ListView" data-win-options="{itemRenderer:itemTemplateUsers}"></div>

Şimdi isterseniz ListView kontrolünün belli başlı özelliklerini inceleyelim.

Event’ler
itemInvoked: Kullanıcı bir item üzerine tıkladığında veya dokunduğunda fırlatılacak event’tir.
keyboardNavigating: Kullanıcı klavyeyi kullanarak nesneler arasında dolaşıp seçimi değiştirdiğinde fırlatılacak event’tir.
loadingStateChanged: Listview’a data yüklemesi bittiğinde fırlatılacak event’tir. Ready ve Loading state’leri vardır.
selectionChanged: Kullanıcının seçtiği item değiştiğinde fırlatılacak event’tir.
selectionChanging: Kullanıcının seçtiği item değişmeye başladığında fırlatılacak event’tir.

Metod’lar:
elementFromIndex(index): Vermiş olduğumuz index’te bulunan elemanı geri döndüren metoddur.
indexOfElement(htmlObject): Vermiş olduğumuz eleman’ın index’ini geri döndüren metoddur.
loadMorePages(): Listview kontrolünün loadingBehavior özelliği incremental olarak set edildiği durumlarda bir sonraki set’in yüklenmesini tetikleyen metoddur.

Property’ler:
currentItem: Kullanıcının seçmiş olduğu item’ı alabileceğimiz veya kullanıcı yerine item seçebileceğimiz metoddur.
groupDataSource: Listview’in itemDataSource’unda bulunan nesnelerin gruplarının bilgisinin bulunduğu datasource’u taşır. Gruplama özelliğinde kullanılır. Bunun için ayrıca bir örnek yapacağız.
groupHeaderTemplate: Grup başlıklarının template’lerinin set edilmesi için kullanılır.
indexOfFirstVisible: Kullanıcı tarafından ekranda görülen ilk nesnenin index’ini verir.
indexOfLastVisible: Kullanıcı tarafından ekranda görülen son nesnenin index’ini verir.
itemDataSource: Listview içerisinde bulunacak item’lar için kullanılacak datasource nesnesini taşır.
itemTemplate: ListView içerisinde bulunacak item’lar render edilirken kullanılacak template’in set edilmesi için kullanılır.
layout: Listview’in GridLayout biçiminde mi yoksa ListLayout biçiminde mi yükleneceğinin belirlendiği özelliktir. GridLayout ve ListLayout’a ait özelliklere makalenin ilerleyen kısımlarında değineceğiz.
loadingBehavior: Nesnelerin yüklenmesinin nasıl yapılacağı ve bir seferde kaç nesne yükleneceğinin belirlendiği özelliklerdir. randomaccess ve incremental değerleri vardır. RandomAccess değerinde bir sayfada kullanıcının görüntüleyebileceği sayıda nesneyi otomatik olarak yükler. Incremental değerinde ise pagesToLoad özelliğinde belirtildiği kadar sayfayı yükler. automaticalyLoadPages değeri true olduğu sürece kullanıcı sayfa sonlarına geldikçe nesneleri yüklemeye devam eder. Ayrıca istenildiği durumda loadMorePages metodu çağrılarak sayfaların manuel yüklenmesi sağlanabilir.
loadingState: Listview’in yükleme aşamasında mı olduğu yoksa yüklemenin bittiği mi bilgisini tutar.
pagesToLoad: loadingBehavior’da incremental seçildiği durumda kaç sayfanın yükleneceğinin belirlendiği özelliktir.
selection: ListView’in seçilmiş olan nesnelerinin saklandığı özelliktir.
selectionMode: ListView’in üzerinde kaç nesne seçilebileceğine ait özelliktir. Değerleri none, single, multi olabilir.
swipeBehavior: Listview’in swipe dokunmatik etkileşimine nasıl tepki vereceği belirlenir. Seçenekler none veya select’tir. Select seçili ise kullanıcı swipe ettiği nesneleri seçer.
tapBehavior: Kullanıcı ListView’da bulunan bir nesneye tıkladığında nasıl bir aksiyon gerçekleşeceğini belirler. Seçenekler directSelect, toggleSelect, invokeOnly veya none’dır. DirectSelect’te kullanıcı nesneyi seçer, ToggleSelect’te ise nesnenin seçim modunu değiştirir. InvokeOnly’de ise kullanıcı bir seçim işlemi yapmaz ama itemInvoked metodu fırlatılır. None seçiminde herhangi bir işlem yapılmaz.

Şimdi isterseniz Gridlayout nesnesinin özelliklerini inceleyelim:
groupHeaderPosition: Grup başlıklarının nasıl konumlandırılacağını belirler. Değerler left veya top olabilir.
horizontal: ListView içeriisndeki nesnelerin yatay mı, dikey mi sıralacağının belirlendiği özelliktir. Yatay için true, dikey için false değerleri kullanılır.
maxRows: En fazla kaç satır gösterileceğinin belirlendiği özelliktir.

ListLayout nesnesinin ise sadece horizontal özelliği vardır ve GridLayout nesnesinin horizontal özelliği ile aynı görevi görmektedir.

Şimdi isterseniz Listview üzerinde bazı özellikleri değiştirerek bu özelliklerin ne şekilde kullanıldığını inceleyelim. Bunun için bu özellikleri dinamik değiştirdiğimiz bir uygulama yapıyoruz.

HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>ListView</title>

    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.1.0.RC/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.1.0.RC/js/base.js"></script>
    <script src="//Microsoft.WinJS.1.0.RC/js/ui.js"></script>

    <!-- ListView references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
</head>
<body>

    <div id="template1" data-win-control="WinJS.Binding.Template">
        <div style="margin: 5px">
            <img data-win-bind="src: image" style="width: 50px; height: 50px; text-align: center" />
            <div data-win-bind="innerText: name" style="text-align: left"></div>
        </div>
    </div>
    <div id="template2" data-win-control="WinJS.Binding.Template">
        <div style="margin: 5px">
            <div data-win-bind="innerText: name" style="text-align: left"></div>
        </div>
    </div>
    <label>Layout : </label>
    <select id="layoutType">
        <option value="WinJS.UI.ListLayout" label="ListLayout"></option>
        <option value="WinJS.UI.GridLayout" label="GridLayout"></option>
    </select>
    <label>
        Selection Mode :
    </label>
    <select id="selectionMode">

        <option value="single" label="Single"></option>
        <option value="multi" label="Multi"></option>
        <option value="none" label="None"></option>
    </select>
    <label>
        Tap Behavior :
    </label>
    <select id="tapBehavior">
        <option value="none" label="None"></option>
        <option value="directSelect" label="DirectSelect"></option>
        <option value="toggleSelect" label="ToggleSelect"></option>
        <option value="invokeOnly" label="InvokeOnly"></option>

    </select>
    <label>
        Template :
    </label>
    <select id="template">
        <option value="template1" label="Resimli"></option>
        <option value="template2" label="Resimsiz"></option>

    </select>
    <br />

    <div id="userListView" data-win-control="WinJS.UI.ListView" data-win-options="{itemTemplate:select('#template1')}"></div>
    <br /><br />
    <label>Aksiyonlar : </label>
    <input type="button" id="btnCurrentItem" value="Aktif Nesne"/>
    <input type="button" id="btnIndexOfFirstVisible" value="İlk Görünen Nesne"/>
    <input type="button" id="btnIndexOfLastVisible" value="Son Görünen Nesne"/>
    <input type="button" id="btnSelectedItems" value="Seçili Nesneler"/>
    <br /><br />
    <div id="log"></div>

</body>
</html>

JavaScript

// For an introduction to the Blank template, see the following documentation:
// http://go.microsoft.com/fwlink/?LinkId=232509
(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    WinJS.strictProcessing();

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                // TODO: This application has been newly launched. Initialize
                // your application here.
            } else {
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }
            args.setPromise(WinJS.UI.processAll());
            loaded();
        }
    };
    function loaded() {
        var usersArray = [
            { image: '/images/user/1.jpg', name: 'Ayşe1' },
            { image: '/images/user/2.jpg', name: 'Ali1' },
            { image: '/images/user/3.jpg', name: 'Ahmet1' },
            { image: '/images/user/4.png', name: 'Mehmet1' },
            { image: '/images/user/5.png', name: 'Mustafa1' },
             { image: '/images/user/1.jpg', name: 'Ayşe2' },
            { image: '/images/user/2.jpg', name: 'Ali2' },
            { image: '/images/user/3.jpg', name: 'Ahmet2' },
            { image: '/images/user/4.png', name: 'Mehmet2' },
            { image: '/images/user/5.png', name: 'Mustafa2' },
        ]

        var dataList = new WinJS.Binding.List(usersArray);

        var lst = document.getElementById('userListView').winControl;
        lst.itemDataSource = dataList.dataSource;

        layoutType.addEventListener('change', function () {
            SetListLayoutType(lst)
        });
        selectionMode.addEventListener('change', function () {
            lst.selectionMode = selectionMode.value;
        });
        tapBehavior.addEventListener('change', function () {
            lst.tapBehavior = tapBehavior.value;
        });
        template.addEventListener('change', function () {
            lst.itemTemplate = document.getElementById(template.value);
        });

        btnCurrentItem.addEventListener('click', function () {
            var key = lst.currentItem.key;
            PrintToLog('Aktif Nesne Adı : ' + dataList.getItemFromKey(key).data.name);
        });

        btnIndexOfFirstVisible.addEventListener('click', function () {
            var index = lst.indexOfFirstVisible;
            PrintToLog('İlk Gözüken Nesne Adı : ' + dataList.getItem(index).data.name);
        });

        btnIndexOfLastVisible.addEventListener('click', function () {
            var index = lst.indexOfLastVisible;
            PrintToLog('Son Gözüken Nesne Adı : ' + dataList.getItem(index).data.name);
        });

        btnSelectedItems.addEventListener('click', function () {
            lst.selection.getItems().then(function (items) {
                var selected = '';
                for (var i = 0; i < items.length ; i++) {
                    selected += items[i].data.name + ', ';
                }
                PrintToLog('Seçili Nesneler : ' + selected);
            });

        });

        lst.addEventListener('iteminvoked', function (e) {
            PrintToLog('Nesne Invoke Oldu : ' + dataList.getItem(e.detail.itemIndex).data.name);
        });

        lst.addEventListener('loadingstatechanged', function (e) {
            PrintToLog('ListView Durumu : ' + lst.loadingState);
        });

        lst.addEventListener('selectionchanged', function (e) {
            PrintToLog('ListView seçim değişti');
        });

        SetList(lst);
    }
    function PrintToLog(s) {
        log.innerHTML = s + '<br>' + log.innerHTML;
    }
    function SetList(lst) {
        SetListLayoutType(lst);
        lst.selectionMode = 'single';
        lst.tapBehavior = 'none';
        lst.itemTemplate = document.getElementById('template1');

    }
    function SetListLayoutType(lst) {
        if (layoutType.value == 'WinJS.UI.ListLayout') {
            lst.layout = new WinJS.UI.ListLayout();
        }
        else {
            lst.layout = new WinJS.UI.GridLayout();
        }
    }

    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. You might use the
        // WinJS.Application.sessionState object, which is automatically
        // saved and restored across suspension. If you need to complete an
        // asynchronous operation before your application is suspended, call
        // args.setPromise().
    };

    app.start();
})();

Ve ekran görüntüsü aşağıdaki gibi oluyor:

Örnek Kodlar

Windows 8 MetroStyle JavaScript Uygulamalarda DataBinding

Bu makalemde sizlere Windows 8 Metro Style uygulama geliştirmede JavaScript yaklaşımını kullandığımızda DataBinding işlemini nasıl yapabileceğimizden bahsedeceğim.

DataBinding uygulama geliştirme yaklaşımlarında nesne içerisindeki verileri kontrollere kolay bir şekilde bastığı için çok önemli bir adımdır. Bu makalemde databinding işleminin JavaScript tarafında nasıl yapılacağını incelerken aynı zamanda bazı kontrolleri de inceliyor olacağız. Bu kontroller ListView, Itemtemplate’dir.

Deklaratif DataBinding kullanılması işimizi çok kolaylaştıran bir özelliktir. Yani bir nesnenin bir özelliğindeki değeri bir kontrolün bir özelliğine direk olarak atayabiliyor olacağız. Bunu da javascript kodu yazmadan html kodu içerisinde yapacağız ki bu da işlemimizi çok kolaylaştırıyor olacaktır.

DataBinding yaptığımızda genellikle collection’ları bind ederiz. Eskiden bunu yapmak için çeşitli döngüler yazmak zorunda kalırdık. Ancak WinJS kütüphanesindeki Listview kontrolü sayesinde bu döngüleri yazmadan çok kolay bir şekilde nesnelerimizi bind edebiliyor olacağız. Listview her nesnemiz için ui render ederken ItemTemplate dediğimiz kontrolü kullanacaktır. ItemTemplate’den bahsetmek gerekirse WinJS kütüphanesinde bulunur ve render edilecek tek bir nesnenin hangi formatta render edileceğini belirler. ItemTemplate içerisinde tüm kontrolleri kullanabilir ve nesnelerimizdeki özellikleri bu kontrollerin özelliklerine atayabiliriz.

Şimdi isterseniz, bu iki nesnenin nasıl kullanıldığına dair bir örnek yapalım.

Bunun için öncelikle ListView nesnemizi aşağıdaki gibi oluşturuyoruz:

<div id="listUsers" data-win-control="WinJS.UI.ListView"></div>

Ancak Listview kullandığımız her zaman datasource’da bulunan her nesnenin ekrana render edilmesi gerekmektedir. Bu render işleminin nesne başına nasıl olacağını belirlenmesi için ItemTemplate kullanılması gerekmektedir. ItemView’i ise aşağıdaki gibi oluşturabiliriz. Gördüğünüz gibi div’imizin data-win-control özelliğine WinJS.Binding.Template tipini veriyoruz. Bu kontrolün içerisinde ise istediğimiz kontrolü kullanabiliyoruz. Datasource’da bulunan her nesne için render edilecek kontroller de bunlar olacaktır. Kullandığımız bu kontrollerin özelliklerine datasource’umuzdaki özellikleri atamak için data-win-bind özelliğini kullanıyoruz. Bu özelliğin içerisine kullandığımız kontrolün hangi özelliğine datasource’daki hangi özelliğin atanacağını kontrolözelliği:DataSourceÖzelliği şeklinde atıyoruz.

<div id="itemTemplateUsers" data-win-control="WinJS.Binding.Template">
    <div style="margin:5px">
        <img data-win-bind="src:UserImage" style="width:150px;height:150px" />
        <div data-win-bind="innerText:UserName" style="text-align:center"></div>
    </div>
</div>

Şimdi ise oluşturmuş olduğumuz bu ItemTemplate’in ListView tarafından kullanılmasını sağlamak. Bunun için ListView kontrolümüzün data-win-options özelliğine oluşturacağımız json nesnesi ile bu tanımlamayı yapmamız gerekiyor. Bu tanımlamayı aşağıdaki gibi yapabiliyoruz. ListView’in itemRenderer özelliğine oluşturmuş olduğumuz ItemTemplate’in id’sini vererek bu işlemi yapıyoruz. Bu sayede listview içerisinde oluşturulacak her nesne için itemTemplateUsers div’inin render edilmesini sağlıyoruz.

<div id="listUsers" data-win-control="WinJS.UI.ListView" data-win-options="{itemRenderer:itemTemplateUsers}"></div>

Bunun yanı sıra Windows 8 uygulamalarında GridLayout veya ListLayout isminde iki çeşit Layout söz konusudur. Grid Layout Windows 8 ‘in başlangıç ekranında gördüğünüz biçim olurken ListLayout sadece aşağıya doğru tekrar eden bir layout’tur. Ben bu örnekte öncelikle GridLayout kullanacağım. Bunu ListView’in type özelliğinde belirtiyorum:

<div id="listUsers" data-win-control="WinJS.UI.ListView" data-win-options="{itemRenderer:itemTemplateUsers,layout:{WinJS.UI.GridLayout}}"></div>

Şimdi ise örnek bir data oluşturup ListView’imize bağlayalım. Burada önemli bir nokta itemtemplate div’inin her zaman listview div’inden yukarıda olması gerektiğidir.

Javascript kodumuzda ise aşağıdaki kodu yazıyoruz:

function loaded() {
    var usersArray = [
        { image: '/images/user/1.jpg', name: 'Ayşe' },
        { image: '/images/user/2.jpg', name: 'Ali' },
        { image: '/images/user/3.jpg', name: 'Ahmet' },
        { image: '/images/user/4.jpg', name: 'Mehmet' },
        { image: '/images/user/5.jpg', name: 'Mustafa' },
]

    var dataList = new WinJS.Binding.List(usersArray);

    var usersList = document.getElementById('listUsers').winControl;
    usersList.itemDataSource = dataList.dataSource;
}

Uygulamamızı çalıştırdığımızda tüm kodumuz ve ekran görüntümüz aşağıdaki gibi olacaktır:

HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>DataBinding</title>

    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.1.0.RC/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.1.0.RC/js/base.js"></script>
    <script src="//Microsoft.WinJS.1.0.RC/js/ui.js"></script>

    <!-- DataBinding references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
</head>
<body>
     <!-- ItemTemplate'imizi oluşturuyoruz. -->
    <div id="itemTemplateUsers" data-win-control="WinJS.Binding.Template">
        <div style="margin:5px">
            <img data-win-bind="src: image" style="width:150px;height:150px" />
            <div data-win-bind="innerText: name" style="text-align:center"></div>
        </div>
    </div>
    <!-- Öncelikle ListView kontrolümüzü oluşturuyoruz-->
    <div id="listUsers" data-win-control="WinJS.UI.ListView" data-win-options="{itemTemplate : select('#itemTemplateUsers')}"></div>

</body>
</html>

JavaScript

// For an introduction to the Blank template, see the following documentation:
// http://go.microsoft.com/fwlink/?LinkId=232509
(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    WinJS.strictProcessing();

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                // TODO: This application has been newly launched. Initialize
                // your application here.
                args.setPromise(WinJS.UI.processAll());
                loaded();
            } else {
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }

        }

    };
    function loaded() {
        var usersArray = [
            { image: '/images/user/1.jpg', name: 'Ayşe' },
            { image: '/images/user/2.jpg', name: 'Ali' },
            { image: '/images/user/3.jpg', name: 'Ahmet' },
            { image: '/images/user/4.png', name: 'Mehmet' },
            { image: '/images/user/5.png', name: 'Mustafa' },
        ]

        var dataList = new WinJS.Binding.List(usersArray);

        var usersList = document.getElementById('listUsers').winControl;
        usersList.itemDataSource = dataList.dataSource;
    }
    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. You might use the
        // WinJS.Application.sessionState object, which is automatically
        // saved and restored across suspension. If you need to complete an
        // asynchronous operation before your application is suspended, call
        // args.setPromise().
    };

    app.start();
})();

Örnek Kodlar

Windows 8 MetroStyle Uygulamalarda Menu Kullanımı

Bu makalemde sizlere Windows 8 Metro Style uygulama geliştirmede Menu kontrolünün nasıl kullanılabileceğinden bahsedeceğim.

Menu kontrolü sadece Javascipt ile uygulama geliştirirken kullanabileceğimiz bir kontroldür ve temel olarak PopupMenu ve Popup kontrolleri ile benzerlik göstermektedir. Dolayısıyla bu kontrolün özelliğini XAML tarafında yine Popup kontrolü ile geliştirebiliriz.

Bu kontrolün özelliklerinden bahsedecek olursak :

Event’lar:
AfterHide: Menu kontrolü gizlendikten sonra fırlatılacak event’tir.
AfterShow: Menu kontrolü gösterildikten sonra fırlatılacak event’tir.
BeforeHide: Menu kontrolü gizlenmeden hemen önce fırlatılacak event’tir.
BeforeShow: Menu kontrolü gösterilmeden hemen önce fırlatılacak event’tir.

Metod’lar:
getCommandById(id): Menünün içerisinde belirtilen id ile belirlenmiş komutu döndürür. Dönüş tipi MenuCommand nesnesidir.
hide(): Menu’yü gizler.
hideCommands(commands): Menünün içerisinde array ile geçirilen MenuCommand nesnesine ait komutları menüden gizler. MenuCommand nesnesi referansları yerine komutların Id’leri de parametre geçirilebilmektedir.
Show(anchor, placement, alignment): Menü’yü göstermek için çağrılacak metoddur.
showCommands(commands): Menünün içerisinde array ile geçirilen MenuCommand nesnesine ait komutları menüde gösterir. MenuCommand nesnesi referansları yerine komutların Id’leri de parametre geçirilebilmektedir. Komutlar daha önceden gizlenmişse tekrar gösterilmesine yarar.
showOnlyCommands(commands): Menünün içerisinde array ile geçirilen MenuCommand nesnesine ait komutları menüde gösterir ve diğer komutları gizler. MenuCommand nesnesi referansları yerine komutların Id’leri de parametre geçirilebilmektedir.

Property’ler
alignment: Flyout’un nereye yaslanacağının belirlendiği özelliktir.
anchor: Flyout’un açılırken hangi elemana yaslı olacağını belirten özelliktir.
placement: Flyout’un Anchor ile belirtilen elemanın neresinde açılacağının belirlendiği özelliktir.
commands: Menü komutlarının array olarak saklandığı özelliktir. MenuCommand nesnesi tipinde değerler taşırlar.

Menü’lerin içerisine komutlar oluşturmaya yarayan MenuCommand nesnesini de incelemekte fayda var. İsterseniz şimdi bu nesnenin özelliklerini inceleyelim.

disabled: true veya false değerlerini alır. Belirtilen komutun enabled olup olmayacağını belirler.
extraClass: MenuCommand nesnesine extra stil eklemek için kullanılır.
flyout: Eğer kontrol tipi olarak flyout seçilmiş ise button’a tıklandığında hangi flyout kontrolünün açılacağı bu özellik sayesinde belirlenir.
hidden: Belirtilen komutun gözüküp gözükmediğini belirler.
id: Belirtilen komutun id’sini belirler. Bu aynı zamanda oluşturulacak komutun id’isidir.
label: Bu komut’un üzerinde text olarak ne gözükeceğinin belirlendiği özelliktir.
onclick: Bu komuta tıklandığında hangi fonksiyonun çağrılacağının belirlendiği özelliktir.
selected: Belirtilen komutun seçili olup olmadığını belirtildiği özelliktir.
type: oluşturulacak komut için hangi tip kontrolün kullanılacağının belirlendiği özelliktir. Değerleri button, toggle, flyout veya separator olabilir.

Şimdi isterseniz bu özelliklerin tamamını kullandığımız örnek bir demo yapalım.

Bunun için sayfamıza menüyü açabileceğimiz bir button ekliyoruz ve daha sonrasında menü kontrolümüzü oluşturuyoruz. Menü kontrolümü tüm WinJS kontrollerimiz gibi data-win-control özelliği içerisine tipi tanımlanarak oluşturuluyor.

Menu kontrolümüz içerisine ise MenuCommand nesnelerini oluşyutuyoruz. Bunun için button tag’ını kullanıp data-win-control özelliğine WinJS.UI.MenuCommand tipini veriyoruz daha sonra ise her button için yukarıda tanımlı özellikleri json formatında data-win-options özelliğine veriyoruz.

Button’umuzun click olayında ise menümüzü show metodunu çağırarak açıyoruz. Bu örnek uygulamada ayrıca menu nesnesinin event’lerini de nasıl kullanabileceğimizi görüyoruz. Uygulamanın kodunu inceleyecek olursak:

HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>App1</title>

    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.1.0.RC/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.1.0.RC/js/base.js"></script>
    <script src="//Microsoft.WinJS.1.0.RC/js/ui.js"></script>

    <!-- App1 references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
</head>
<body>

    <input type="button" value="Menüyü Göster" id="btnShowMenu" />
    <div id="menu" data-win-control="WinJS.UI.Menu">
        <!-- Menümüzün içerisine normal bir button oluşturuyoruz. -->
        <button data-win-control="WinJS.UI.MenuCommand" data-win-options="{id:'cmd1',label:'Button ',type:'button'}"></button>
        <!-- Menümüzün içerisine disabled bir button oluşturuyoruz. -->
        <button data-win-control="WinJS.UI.MenuCommand" data-win-options="{id:'cmd2',label:'Disabled Button ',type:'button',disabled:'true'}"></button>
        <!-- Menümüzün içerisine seçilmiş button oluşturuyoruz. -->
        <button data-win-control="WinJS.UI.MenuCommand" data-win-options="{id:'cmd3',label:'Selected Button',type:'button',selected:'true'}"></button>
        <!-- Menümüzün içerisine toggle button oluşturuyoruz. -->
        <button data-win-control="WinJS.UI.MenuCommand" data-win-options="{id:'cmd4',label:'Toggle Button ',type:'toggle'}"></button>
        <!-- Menümüzün içerisine seperatör oluşturuyoruz. -->
        <button data-win-control="WinJS.UI.MenuCommand" data-win-options="{id:'cmd5',type:'seperator'}"></button>
        <!-- Menümüzün içerisine tıklandığında bir flyout kontrolünü açacak button oluşturuyoruz. -->
        <button data-win-control="WinJS.UI.MenuCommand" data-win-options="{id:'cmd6',label:'Flyout Button ',type:'flyout',flyout:'fo'}"></button>
    </div>

    <div id="fo" data-win-control="WinJS.UI.Flyout">
        <label>Ad Soyad</label>
        <input type="text" />
        <input type="button" value="Gönder" />
    </div>
    <div id="log" style="margin-left:250px">

    </div>
</body>
</html>

JavaScript

// For an introduction to the Blank template, see the following documentation:
// http://go.microsoft.com/fwlink/?LinkId=232509
(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    WinJS.strictProcessing();

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                // TODO: This application has been newly launched. Initialize
                // your application here.
            } else {
                // TODO: This application has been reactivated from suspension.
                // Restore application state here.
            }
            args.setPromise(WinJS.UI.processAll());

            loaded();
        }
    };

    function loaded()
    {
        btnShowMenu.addEventListener('click', function () { menu.winControl.show(btnShowMenu, 'bottom'); });
        document.getElementById('cmd1').addEventListener('click', tiklandi);
        document.getElementById('cmd2').addEventListener('click', tiklandi);
        document.getElementById('cmd3').addEventListener('click', tiklandi);
        document.getElementById('cmd4').addEventListener('click', tiklandi);
        document.getElementById('cmd5').addEventListener('click', tiklandi);
        document.getElementById('cmd6').addEventListener('click', tiklandi);

        menu.winControl.addEventListener('beforeshow', function () { log.innerHTML += 'menu açılıyor<br>'; });
        menu.winControl.addEventListener('aftershow', function () { log.innerHTML += 'menu açıldı<br>'; });
        menu.winControl.addEventListener('beforehide', function () { log.innerHTML += 'menu kapanıyor<br>'; });
        menu.winControl.addEventListener('afterhide', function () { log.innerHTML += 'menu kapandı<br>'; });
    }
    function tiklandi(cmd)
    {
        log.innerHTML += cmd.srcElement.innerText+ ' tıklandı<br>';
    }

    app.oncheckpoint = function (args) {
        // TODO: This application is about to be suspended. Save any state
        // that needs to persist across suspensions here. You might use the
        // WinJS.Application.sessionState object, which is automatically
        // saved and restored across suspension. If you need to complete an
        // asynchronous operation before your application is suspended, call
        // args.setPromise().
    };

    app.start();
})();

En son olarak uygulamamızın çalışır haldeki ekran görüntüsüne bakıyoruz.

Örnek Kodlar