Windows Phone, Windows 8 Converter Kullanımı

Windwos Phone yada Windows 8 app. dev.’da ItemSource ile uğraşıyorsanız emin olun muhakkak uygulamanın bir yerinde Converter’a ihtiyacınız olmuştur yada olacaktır. Peki nedir Converter, Ne işe yarar, Nasıl kullanılır ?

Converter kısaca ; ItemSource olarak verilen Data’ya Binding işleminden önce müdahale etmektir şeklinde tanımlayabiliriz.

Örneğin bir sayfa var ve o sayfada WebService’den gelen bir liste var elimizde ve içerisinde Product objesi ve objeninde ProductName ProductID ve Quantity bilgileri var diyelim. Servisten gelen bu response’u alıp bir WinPhone uygulamasında Binding ile ekrana taşımak istiyoruz. Binding le uğraşan arkadaşlar biliyorlardır buraya kadar hiçbir sorun yok direk olarak Listbox yada başka bir kontrole ItemSource verip gerekli Binding’ leri verdikten sonra ekranda kolayca göreceğizdir.

Peki ya müşteriden şöyle bir istek gelirse ; “Ben Qantity bilgisi sıfır gelen ürünlerin adet satırında sıfır değilde Not Available yazsın istiyorum” derse ne yapacağız ? Gereksiz yere Database'de ilgili tabloda alan açıp o bilgiyide orada saklayacak halimiz yok. İşte Converter bu ve benzeri durumlarda devreye giriyor ve işimizi kolaylaştırıyor. Şimdi yukarıda bahsettiğimiz case'i aşağıda olduğu gibi bir adet ConverterSample adında WinPhone projesi oluşturarak inceleyelim.

 Öncelikle aşağıda olduğu gibi Producta adında bir class tanımlıyoruz.

public class Product
{
public int ProductID { get; set; }
public string ProductName { get; set; }
public int Quantity { get; set; }
}

 Sornasında geriye List<Product> dönen GetAllProducts() adında metod yazıyoruz ve örnek ürünleri store ediyoruz.

public List<Product> GetAllProducts()
{
List<Product> _allProducts = new List<Product>();
_allProducts.Add(newProduct()
{
ProductID = 111,
ProductName = "Product 111",
Quantity = 124
});
_allProducts.Add(newProduct()
{
ProductID = 112,
ProductName = "Product 112",
Quantity = 75
});
_allProducts.Add(newProduct()
{
ProductID = 113,
ProductName = "Product 113",
Quantity = 47
});
_allProducts.Add(newProduct()
{
ProductID = 114,
ProductName = "Product 114",
Quantity = 32
});
_allProducts.Add(newProduct()
{
ProductID = 115,
ProductName = "Product 115",
Quantity = 0
});
_allProducts.Add(newProduct()
{
ProductID = 116,
ProductName = "Product 116",
Quantity = 4
});
return _allProducts;
}

Code behind da en son olarak Constructor içerisinde üstte yazdığımız metoddan dönen List’i alıp Xaml tarafta oluşturacağımız ListBox’a ItemSource olarak vereceğiz.

// Constructor
public MainPage()
{
InitializeComponent();
lb_products.ItemsSource = GetAllProducts();
}

Xaml tarafında ise Grid içerisinde Row, ve  ListBox’ı oluşturup gerekli Bind işlemlerini yapıp projemizi çalıştırıyoruz ve aşağıdaki gibi bir görüntü alıyoruz.

    

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
 
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="Converter Expample" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
            <TextBlock Text="Product List" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
 
        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="50"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="50"/>
                <ColumnDefinition Width="250"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <TextBlock
                Grid.Row="0"
                Grid.Column="0"
                Text="ID"
                FontWeight="Bold"/>
            <TextBlock
                Grid.Row="0"
                Grid.Column="1"
                Text="ProductName"
                FontWeight="Bold"/>
            <TextBlock
                Grid.Row="0"
                Grid.Column="2"
                Text="Quantity"
                FontWeight="Bold"/>
            <ListBox
                x:Name="lb_products"
                Margin="0,60,0,0"
                Width="480">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="50"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="50"/>
                                <ColumnDefinition Width="250"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>
                            <TextBlock
                                Grid.Row="0"
                                Grid.Column="0"
                                FontWeight="Bold"
                                Text="{Binding ProductID}"/>
                            <TextBlock
                                Grid.Row="0"
                                Grid.Column="1"
                                FontWeight="Bold"
                                Text="{Binding ProductName}"/>
                            <TextBlock
                                Grid.Row="0"
                                Grid.Column="2"
                                FontWeight="Bold"
                                Text="{Binding Quantity}"/>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>

 

Yujkarıda olduğu gibi listbox'ımıza Itemsource olarak ürünlerimizi verdik ve Quantity bölümündeki bilgileri uygulamamızda gösterdik. ID'si 115 olan ürünün Quantity değeride "0" olarak geldi. Buraya kadar herşey güzel ancak müşteri bizden Quantity bölümünde sıfır olan ürünler için Not Available yazılmasını söyledi ama biz ekrana Service’den gelen datayı yazdırdık.

Converter için ilk olarak Projemize bir adet QuantityConverter adında class ekliyoruz ve class’ımıza IvalueConverter interface’ini uyarlıyoruz ve IvalueConverter Convert ve ConvertBack adında sahip olduğu 2 adet metodu class’ımıza ekleniyor.Biz şimdilik Convert metodunu kullanacağız. ConvertBack’in ne işe yaradığını ilerki yazılarda bahsedeceğiz. Convert metodunun içerisini aşağıda olduğu gibi değiştiriyoruz.

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (int)value == 0 ? "Not Available" : value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}

Şimdi sırada yazmış olduğumuz Converter’ı Binding işlemine entegre etmek. Bunun için xaml tarafına yazmış olduğumuz Converter’ı tanıtmalıyız. İlk olarak xmlns:Converter="clr-namespace:ConverterSample" Converter adını verdiğimiz namespace’i eklemek ve en dıştaki Grid’in üstüne aşağıda olduğu gibi Converter’ı Resource olarak yazmak.

   

 <phone:PhoneApplicationPage.Resources>
        <ResourceDictionary>
            <Converter:QuantityConverter x:Key="QuantityConverter"/>
        </ResourceDictionary>
    </phone:PhoneApplicationPage.Resources>

 

Son işlem olarak Quantity bilgisini Bind ettiğimiz yere QuantityConverter’ı yazmak,

<TextBlock
Grid.Row="0"
Grid.Column="2"
FontWeight="Bold"
           Text="{Binding Quantity,Converter={StaticResource QuantityConverter}}"/>

Visual State Nedir ? Nasıl Kullanılır ?

Visual State Kavramı blend yardımı ile xaml tarafında oluşturulan arayüzler için belirlenen state’lere göre story board aracılığı ile geçiş efektleri ve animasyonlar yapmamızı sağlayan yapıdır.

Kısaca şöyle örnekleyebiliriz; üzerinde “Aç” yazan bir butonumuz var ve kullanıcı bu butona bastığı anda ekranın üstünde bulunup o an kullanıcıya görünmeyen bir pop-up’ın yukarıdan aşağıya doğru düştüğünü ve o pop-up üzerinde bulunan “Kapat” butonuna basıldığında tekrar yukarıya doğru çıkıp sayfa üzerinden kaybolduğunu düşünelim. İçimizden “Neden bunu çok rahat bir şekilde story board kullanarak yapmayalım ki ?” diye soran arkadaşlar olacaktır ve bunun cevabını ise şu şekilde verebiliriz.

  • Story Board genel olarak uygulama içerisinde animasyonların ve değişik birbirini takip eden efektlerin olduğu yapıların hazırlanması için kullanılmalıdır.
  • Visual State ise control’ün yapacağı işlevler sınırlı olduğu durumda yani control’ün stateleri belli olup daha kısıtlayıcı efektlere ihtiyaç duyulduğunda kullanılması gereken yapıdır.

 

Üstte verdiğimiz örneği düşündüğümüzde bizim 2 adet state’imiz bulunmaktadır.

               1-Pop-up’ın açılması,

               2-Pop-up’ın kapatılması.

Yani ihtiyacımız olan şey  Visual State ‘dir.

 Gelin şimdi 1 adet windows phone app oluşturarak o örneği yapalım

 Xaml kodları ve ekran görüntüsü aşağıdaki gibi olan bir arayüz oluşturduk,

  

<Grid
        x:Name="ContentPanel"
        HorizontalAlignment="Stretch">
        <StackPanel
            Margin="0,-200,0,0"
            x:Name="stackPanel"
            VerticalAlignment="Top"
            Background="#f0f0f0"
            Orientation="Vertical">
            <TextBlock
                Margin="20,40,0,0"
                Text="Visual State"
                FontSize="30"
                FontWeight="SemiBold"
                Foreground="#373938"/>
            <Button
                Width="210"
                Margin="0,0,0,0"
                BorderBrush="#F26B28"
                HorizontalAlignment="Center"
                Content="kapat"
                FontWeight="Bold"
                Foreground="#F26B28"/>
        </StackPanel>
        <Button
            Width="210"
            Height="100"
            Margin="0,-0,0,0"
            BorderBrush="#F26B28"
            HorizontalAlignment="Center"
            Content="Aç"
            FontWeight="Bold"
            Background="White"
            Foreground="#F26B28"/>
    </Grid>

 

 Şimdi ise sırada Visual State’leri oluşturma var. Bunun için SolutionExplorar’dan MainPage.xaml’e sağ tıklayıp “Open in Blend” diyoruz ve sayfamızı Blend Exp.’da açıyoruz.

 Açılan sayfada sol menüden pop-up’ımız olduğu StackPanel kontolünü seçip bir üstte bulunan State sekmesinden Add state group’a tıklayıp bir adet VisualState Group oluşturmuş oluyoruz. Gereken “Aç” ve “Kapat” statelerini ise bu gorup içerisinde tanımlayacağız

İlk olarak VisualStateGroup yazan yerin sağ tarafında bulunan Add State’e tıklayarak “Kapat” state 2imizi belirliyoruz. Aynı şekilde bir adet daha state ekleyerek onun adınada “Ac” ismini veriyoruz. 

Kapat ve Ac statelerini sağ taraflarında bulunan Add Transition’a tıklayarak Kapalı durumdan açık duruma gelirken ne gibi bir geçiş olacak onu belirliyoruz ve aynı şeyi Açık durumdan kapalı duruma geçerkende yapıyoruz. Gerekli margin ve transition değerlerini verdikten sonra iki state’in arasındaki geçişi yapacak olan story board’a geçiş süresini belirtiyoruz ve Blend’de bulunan uygulamamızı kaydedip kapatıyoruz ve Visual Studio’ya geri dönüyoruz.

 

Şimdi ise sırada oluşturmuş olduğumuz state’leri gerekli durumlarda çağırma işlemi var.Sayfanın xaml tarafına baktığımızda Visual State kodlarımızın geldiğini göreceksinizdir.

//Aç butonunun click event’ine
VisualStateManager.GoToState(this, "Ac", true);

//Pop-up üzerinde bulunan Kapat butonuna ise
VisualStateManager.GoToState(this, "Kapat", true);

 Kodlarını yazdığımızda oluştumuş olduğumuz stateleri çağırıp gerekli transitionları yapacaktır.

 

 >> catch {Foot in Mouth} 'e düşmemeniz dileğiyle.. Smile <<

Windows Phone HyperlinkButton without Underline

Windows Phone'da en çok kullanılan kontrollerden birisi hiç şüphesiz HyperlinkButton'dur. Sayfaya 1 adet HyperlinkButton ekleyip Content'ine text verip uygulamayı çalıştırdığımızda text'in altı çizili olarak geldiğini göreceksiniz. Bu durum WinPhone projelerinde pekte tercih edilen birşey değildir zira gözede hoş gelmemektedir. Altı çizgisiz HyperlinkButton kullanmak istediğimizde ise çok basit bir şekilde App.xaml içerisine Application.Resources'a style ekleyerek HyperlinkButton'un altındaki çzgiyi yok edebilirsiniz. Örnek kullanım aşağıdaki gibidir;

 

App.xaml sayfası

 

<Application.Resources>
        <Style x:Key="hlbutton_Style" TargetType="HyperlinkButton">
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="FontSize" Value="16"/>
            <Setter Property="Padding" Value="0"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="HyperlinkButton">
                        <Border Background="Transparent">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="MouseOver"/>
                                    <VisualState x:Name="Pressed">
                                        <Storyboard>
                                            <DoubleAnimation Duration="0"
Storyboard.TargetName="TextElement" Storyboard.TargetProperty="Opacity" To="0.5"/>
                                        </Storyboard>
                                        </VisualState>
                                        <VisualState x:Name="Disabled">
                                            <Storyboard>
                                                <ObjectAnimationUsingKeyFrames
Storyboard.TargetName="TextElement" Storyboard.TargetProperty="Foreground">
                                                    <DiscreteObjectKeyFrame KeyTime="0"
Value="{StaticResource PhoneDisabledBrush}"/>
                                                </ObjectAnimationUsingKeyFrames>
                                            </Storyboard>
                                            </VisualState>
                                            </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <Border Background="{TemplateBinding Background}"
Margin="{StaticResource PhoneHorizontalMargin}" Padding="{TemplateBinding Padding}">
                                <TextBlock x:Name="TextElement" Text="{TemplateBinding Content}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}" TextWrapping="Wrap" TextDecorations="none"/>
                                </Border>
                                </Border>
                                </ControlTemplate>
                </Setter.Value>
                </Setter>
                </Style>
</Application.Resources>

App.xaml içerisine yukarıdaki eklemeleri yaptıktan sonra tek yapmanız gereken sayfaya eklediğiniz HyperlinkButton kontolüne Style olarak yukarıda oluşturduğumuz style'ı vermek,

 

<HyperlinkButton Style="{StaticResource hlbutton_Style}"/>

 

Windows Phone Facebook'a Paylaşım Yapma

1.Adım | Visual Studio Projesi Oluşturulması

  • İlk olarak ismi TestApp olan bir adet Windows Phone Projesi oluşturuyoruz

 2.Adım | Design Sayfasının Hazırlanması

  • Uygulama ekranında bir adet TextBox, bir adette Button ve bir adette WebBrowser Kontrolleri olacak, gerekli kontroller eklediğinde en dışta bulunan Grid Design Kodları aşağıda olduğu şekildedir;

    

<Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="Caner Tosuner" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
            <TextBlock Text="Facebook" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <Grid.RowDefinitions>
                <RowDefinition Height="auto"/>
                <RowDefinition Height="auto"/>
            </Grid.RowDefinitions>
            <TextBox Grid.Row="0" Height="150" Name="Message"/>
            <Button Grid.Row="1" Content="Post" Click="Button_Click"/>
        </Grid>
        <phone:WebBrowser Name="Browser" Grid.Row="1" Background="Aqua" Width="450" Height="600" Visibility="Collapsed" Navigated="Browser_Navigated"/>
    </Grid>

 

  • Bu işlemler sonucunda UI aşağıdaki gibi görünecektir.

3.Adım | Facebook AppID Oluşturma

  • Uygulamada Facebook'un geliştirmiş olduğu SDK'yı kullanacağımızdan Facebook bilgilerini kullanacak uygulamayı sistemine kaydetmeyi ve belirli izinler doğrultusunda SDK'yı kullanma izni vermektedir. Bunun için https://developers.facebook.com/apps adresine giderek aşağıda olduğu gibi uygulama oluşturup sonrasında Facebook'un bize vereceği AppID'yi alıp kullanacağız.

     

4.Adım | Facebook SDK'nın Projeye Eklenmesi

  • Facebook'un geliştirmiş olduğu kütüphaneyi uygulamamıza eklemek için Nuget'ı kullanıcaz.Bunun için Visual Studio'dan Tools -> Library Package Manager -> Package Manager Console tıklayıp altta açılan sayfaya  PM> Install-Package Facebook yazıyoruz ve kütüphanenin kurulmasını bekliyoruz. Kurulum tamamlandıktan projemizin References bölümüne aşağıda olduğu gibi Facebook'un eklendiğini görüyor olacaksınız.

5.Adım | FacebookClient Oluşturulup AppID Değerinin Kullanılması

  • FacebookClient nesnesi bizim Facebook API'ları ile connection'ı kurup bütün veri alış verişini sağlayacak olan yapıdır. Facebook'ta yeni uygulama oluştururken bize verilen AppID/App Key kodunu aşağıda AppID değişkenine atıyoruz ve Facebook böylece hangi uygulamanın API'larını kullandığı gibi bilgilere ulaşmış oluyor.
private const string AppID = "Facebok App ID";
private FacebookClient client;
// Constructor
public MainPage()
{
InitializeComponent();
client = new FacebookClient();
 }

6.Adım | Post Buton'u Click Event'i

  • Uygulamadaki senaryo şu şekilde işliyor olacak; TextBlock'a girilen string Post butonuna tıklandığı anda SDK'yı kullanarak Facebook'a bağlanıp kullanıcı adı ve şifre bilgileri doğru girildiğinde bize authentication verecek ve sonrasında paylaşım yapmamızı sağlayacak. Aşağıda Post butonuna tıklandığında çalışacak olan kodlar bulunmaktadır.
private void Button_Click(object sender, RoutedEventArgs e)
{
//API' ile birlikte gönderilecek olan parametreler
var parameters = newDictionary<string, object>();
parameters["client_id"] = AppID;
parameters["redirect_uri"] = "https://www.facebook.com/connect/login_success.html";
parameters["response_type"] = "token";
parameters["display"] = "touch";
 
parameters["scope"] = "publish_stream";
Browser.Visibility = System.Windows.Visibility.Visible;
Browser.Navigate(client.GetLoginUrl(parameters));
}

Bütün bu işlemleri hatasız bir şekilde yapıp uygulamamızı çalıştırdığımızda aşağıdaki gibi bir görüntü alıyor olacağız.

7.Adım | Browser Navigation Event'i

  • Kullanıcı UserName ve Password bilgilerini girip giriş yaptıktan sonra Browser, bizim access token'ımızın yani doğru bir şekilde giriş yaptığımıza dair gerekii bilgiyi API'ları çağırmak için bir URL'e navigate edilecek. Browser'ın Navigated Event'i aşağıdaki gibi olacak.
private void Browser_Navigated(object sender, NavigationEventArgs e)
{
FacebookOAuthResult oauthResult;
//URL'in erişim izni olduğunu kontrol ediyoruz
if (!client.TryParseOAuthCallbackUrl(e.Uri, out oauthResult))
{
return;
}
//Checking that the user successfully accepted our app, otherwise just show the error
if (oauthResult.IsSuccess)
{
client.AccessToken = oauthResult.AccessToken;
 
Browser.Visibility = System.Windows.Visibility.Collapsed;
DuvaraGonder();
}
else
{
MessageBox.Show(oauthResult.ErrorDescription);
Browser.Visibility = System.Windows.Visibility.Collapsed;
}
}

8.Adım | DuvaraGonder() Metodu

  • Bütün bu işlemleri yaptıktan sonra artık başarılı bir şekilde Facebook'a giriş yaptık ve gerekli izinleri aldık bundan sonra yapmamız gereken şey TextBox'dan girilen değeri DuvaraGonder() metodunu kullanarak Timeline Duvarımıza göndermek.
private void DuvaraGonder()
{
var parameters = new Dictionary<string, object>();
parameters["message"] = Message.Text;
client.PostAsync("me/feed", parameters);
}

9.Adım | PostCompleted() Metodu

  • Kullanıcı Post butonuna tıkladıktan sonra göndermiş olduğumuz mesajın başarılı bir şekilde gidip gitmediğini öğrenmek için PostCompleted() metodundan yararlanabiliriz. Gerekli kodları constructor'ın içerisinde EventHandler'ın içerisine ekliyor olacağız.
// Constructor
public MainPage()
{
InitializeComponent();
client = new FacebookClient();
client.PostCompleted += (o, args) =>
{
//Hata Kontrolünün yapıldığı bölüm
if (args.Error != null)
{
Dispatcher.BeginInvoke(() => MessageBox.Show(args.Error.Message));
}
else
{
Dispatcher.BeginInvoke(() => MessageBox.Show("Mesaj başarılı bir şekilde gönderildi"));
}
};
}

10.Adım | Proje Test İşlemi

  • Buraya kadar yazmış olduğumuz kodlar sayesinde artık Facebook'a giriş yapıp TextBlock içerisine yazılan metni Post butonuna tıklandığında Facebook sayfamıza gönderiyor olacağız. Bir üstte yazdığımız 9.Adım'da göndermiş olduğumuz metnin Gidip Gitmediği hakkında bilgide alabiliyoruz. Uygulamayı çalıştırdığımızda ekran görüntüsü aşağıdaki gibi olacaktır.

                                               

11.Adım | Access Token'ın IsolatedStorage ile Kaydedilmesi

  • Kullanıcının uygulamayı kullanıp her Facebook Share işleminde UserName ve Password bilgilerini girmesi hiç istenen birşey değildir. Bizde bunun için Access Token bilgisini IsolatedStorage ile uygulama içerisine kaydedecez.Bunun için SaveAccessToken() adında bir metod yazıcaz.
private void SaveAccessToken(String token)
{
if (!IsolatedStorageSettings.ApplicationSettings.Contains("token"))
IsolatedStorageSettings.ApplicationSettings.Add("token", token);
else
IsolatedStorageSettings.ApplicationSettings["token"] = token;
IsolatedStorageSettings.ApplicationSettings.Save();
}

12.Adım | Access Token'ın IsolatedStorage'dan Okunması

  • Uygulama içerisine kaydettiğimiz Access Token bilgisini kullanıcı paylaşım yapmak istediğinde tekrardan IsolatedStorage'dan okuyor olmamız gerekiyor.Aşağıda bu işlemi yapan GetAccessToken() metodumuzun kodları bulunmaktadır.
private string GetAccessToken()
{
if (!IsolatedStorageSettings.ApplicationSettings.Contains("token"))
return null;
else
return IsolatedStorageSettings.ApplicationSettings["token"] as string;
 }

13.Adım | Uygulama Açıldığında Access Token'ın Kontrol Edilmesi

  • Gerekli metodları yazdıktan sonra uygulama açılış anında ya da her nerde gereki ise AccessToken var mı ? yok mu ? kontrol etmemiz gerekmektedir.Bunuda aşağıda olduğu gibi yapıyoruz.
//AccessToken var mı yok mu kontrolü
if (GetAccessToken() != null)
client.AccessToken = GetAccessToken();

  14.Adım | Expire Olan Token'ın Kontrol Edilmesi

  • PostCompleted handler'ı içerisinde bu kontrolü yapmamız gerekiyor ve kodlar aşağıda olduğu gibi Contructor'ın içerisinde yazıyoruz.
client.PostCompleted += (o, args) =>
{
//Hata Kontrolünün yapıldığı bölüm
if (args.Error != null)
{
//Yetki Hatası
if (args.Error is FacebookOAuthException)
{
Dispatcher.BeginInvoke(() => MessageBox.Show("Yetki Hatası"));
//Hata oluştuğundan dolayı Saved Token'ı uçuruyoruz
SaveAccessToken(null);
client.AccessToken = null;
}
else
Dispatcher.BeginInvoke(() => MessageBox.Show(args.Error.Message));
}
else
   Dispatcher.BeginInvoke(() => MessageBox.Show("Mesaj başarılı bir şekilde gönderildi"));

};

15.Adım | Back Buton'nuna Tıklanılması

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
//Browser görünüyor ise gizle ve navigation event'i iptal et
if (Browser.Visibility == System.Windows.Visibility.Visible)
{
Browser.Visibility = System.Windows.Visibility.Collapsed;
e.Cancel = true;
}
base.OnBackKeyPress(e);
}

16.Adım | Haydi Test Edelim :)

Windows Phone'da Web Service Kullanımı

Mobil tarafta uygulama geliştiriyorsanız Web Service’den kaçışınız imkansızdır. Çünkü database’ler ile mobil uygulama arasındaki iletişimi sağlayacak hizmet Web Service tir ve mobil uygulama aktarılacak olan veri XML yada JSON tipinde yayınlamaktadır. Bu makalede IMKB’den aldığı sonuclarla anlık Döviz Verilerini paylaşan bir XML Web Service’den gelen verileri alıp Parse işlemi yapıp daha sonrasında WP uygulamamızda gösteriyor olacağız.

 

Öncelikle ilk olarak Visual Studio’yu açıp 1 adet adı XML_Parse olan Windows Phone Pivot App Projesi oluşturalım.

 

Design sayfasında Default olarak gelen xaml kodlarını tamamiyle temizleyelim. Bunun için En dıştaki Grid içerisinde bulunan kodları silmek işimizi görecektir. Grid içerisindeki kodları sildiğimizde son hali aşağıda olduğu gibidir.

    

<!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
                  //Bu bölümdeki kodları temizledik
    </Grid>

 

 Bir sonraki işlem olarak Design sayfasını istediğimiz şekilde düzenleyelim. Görünüm olarak daha güzel görüneceğini düşündüğümden WrapPanel kullanmayı tercih ettim.WrapPanel sayesinde uygulama ekranına dinamik olarak yerleşecek Buton’lar Panorama Page gibi geliştirilmiş uygulama havası katacaktır. WrapPanel kullanmak için ilk olarak bir dll’i projenize referans vermeniz gerekiyor. http://silverlight.codeplex.com/downloads/get/270984 sitesinden Silverlight Toolkit kurup daha sonrasında aşağıda olduğu gibi Solution Explorer’da projeniz içerisinde bulunan References’a sağ tıklayıp Add Reference diyip aşağıda dosya yolunda bulunan dll’i projenize referans olarak ekliyorsunuz.

For 32-bit systems:

C:\Program Files\Microsoft SDKs\Windows Phone\v7.1\Toolkit\Aug11\Bin\Microsoft.Phone.Controls.Toolkit.dll

For 64-bit systems:

C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.1\Toolkit\Aug11\Bin\Microsoft.Phone.Controls.Toolkit.dll

Referansı ekledikten sonra uygulamamızın design sayfasına da aşağıda bulunan kod’u yazıyoruz.

 

xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.Toolkit"

Şimdi xaml kodlarını yazmaya başlayabiliriz. Design tarafında kullanacağımız kontrollerin kodları aşağıdaki gibi olacaktır.

       

<Grid.Background>
        <!--Pivot Control-->
        <controls:Pivot x:Name="dovizpivot">
            <!--Pivot item one-->
            <controls:PivotItem Header="Döviz Verileri">
                <ListBox x:Name="lbdovizler" ScrollViewer.VerticalScrollBarVisibility="Disabled" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
                    <ListBox.ItemsPanel>
                        <ItemsPanelTemplate>
                            <toolkit:WrapPanel></toolkit:WrapPanel>
                        </ItemsPanelTemplate>
                    </ListBox.ItemsPanel>
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <Button x:Name="btndoviz" Content="{Binding ADI}" FontSize="32" Background="#0076dd" FontWeight="Bold" Foreground="White" Height="120" Width="150">
                                </Button>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </controls:PivotItem>

 

Senaryo şu şekilde işliyor, Xml olarak gelen verileri Parse edip bir array’in içerisine atacaz ve o array’ide üstte yazdığımız lbdovizler lsitbox’ına ItemsSource olarak verecez. Sonrasında listbox’ın ItemTemplate’inde bulunan Buton’un Content’ine Bind olarak oluşturacağımız object’in ADI attribute’ünü verdiğimizden o Döviz’in ismi ekranda görünecektir.

 Şimdi ise CodeBehind’a geçelim..

Gelen Veriyi Dovizler adında class oluşturarak ona atayacağız, class aşağıdaki şekilde olacaktır.

   

//Service’in sunduğu Xml formatı aşağıdaki gibi.Bize DOVIZ türünde ADI,ALIS,SATIS attributleri olan altinkaynak adında array dönüyor

 public class Dovizler
    {
        public string ADI { get; set; }
        public string ALIS { get; set; }
        public string SATIS { get; set; }
    }

//Dovizleri saklayacağımız List array’i tanımladık.

        List<Dovizler> Dovizler = newList<Dovizler>();
        public MainPage()
        {
            InitializeComponent();
            GetResult();  //GetResult Metodunu çağırıyoruz
        }
//GetResult Metodu bize Web Service’in bulundu adrese giderek orda XML olarak yayınlanmış verileri getirecektir.
        publicvoid GetResult()
        {
            WebClient wc = newWebClient();
            wc.DownloadStringCompleted += wc_DownloadStringCompleted;
            wc.DownloadStringAsync(newUri("http://xml.altinkaynak.com.tr/doviz.xml")); //Service URL’i
        }

 

void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            if (e.Error != null)// Eğer hata mesajı döner ise metod’dan çıkıyoruz
                return;
            try
            {
                XElement xel = XElement.Parse(e.Result);  //gelen veriyi xel’e atıyoruz ve sonrasında nesne haline getirerek array’in içerisine insert ediyoruz
                 Dovizler = from dv in xel.Elements("DOVIZ") //Doviz nesnesine gitmesini söyledik
                           selectnewDovizler()
                           {
    //Doviz nesnesinin hangi attributlerini alacağımızı belirtiyoruz
                               ADI = dv.Element("ADI").Value,
                               ALIS = dv.Element("ALIS").Value,
                               SATIS = dv.Element("SATIS").Value
                           };
                // Son olarak Array’i lbdovizler ListBox’ına ItemsSource olarak veriyoruz
                lbdovizler.ItemsSource = Dovizler;
            }
            catch (Exception)
            {
                MessageBox.Show("Lütfen Daha Sonra Tekrar Deneyin.", "Bilgilendirme", MessageBoxButton.OK);
                return;
            }
        }

Uygulamanın ekran görüntüsü aşağıda olduğu gibidir.

Isolated Storage Kullanımı

Windows Phone' uygulama içerisinde veri saklamak için kullanabileceğimiz çeşitli yapılar vardır. Bunlardan birtanesi IsolatedStorage'dır. IsolatedStorage kullanarak uygulamanın kullanıcı tarafından değiştirilmiş ayarlarını, yada uygulamada UserName Password gibi bilgiler gerekli ise bu bilgileri uygulama her açıldığında sürekli kullanıcıya sormak yerine ilk seferde kullanıcıdan bu bilgileri alıp IsolatedStorage içerisine kolayca kaydedebiliriz.

IsolatedStorage Veri Yazma

private void DosyayaYaz(string text)
{
IsolatedStorageFile storage= IsolatedStorageFile .GetUserStoreForApplication();
IsolatedStorageFileStream fs =storage.CreateFile("data.txt");
StreamWritersw =newStreamWriter(fs);
sw.Write(text); //Metoda gelen text değişkeni içerisindeki değer IsolatedStorage ile data.txt dosyası içerisine kaydedilir
sw.Close();
}

 

IsolatedStorage Veri Okuma

private string DosyadanOku()
{
IsolatedStorageFilestorage= IsolatedStorageFile.GetUserStoreForApplication();
if (storage.FileExists("data.txt"))  //daha öncesinde oluşturduğumuz data.txt adlı dosya varmı diyee kontrol ediyoruz
{
IsolatedStorageFileStream fs = storage.OpenFile("data.txt", System.IO.FileMode.Open, System.IO.FileAccess.Read);
StreamReader sr=new StreamReader(fs);
string kayitliVeri = sr.ReadToEnd();
sr.Close();
}
else
{
return String.Empty; //eğer o isimde bir dosya yok ise boş değer döndürüyoruz
}
return kayitliVeri ;
}

IsolatedStorage Veri Silme

private void DosyaSil()
{
IsolatedStorageFile storage= IsolatedStorageFile.GetUserStoreForApplication();
if(storage.FileExists("data.txt"))
     storage.DeleteFile("data.txt");
else
   return ;
}

>> catch {Foot in Mouth} 'e düşmemeniz dileğiyle.. Smile <<

 

Windows 8.1 Tanıtım Videosu Yayınlandı

Windows 8'e gelecek en büyük ve en kapsamlı güncelleme olması beklenen Windows 8.1'in kullanım videosu yayınlandı.

Windows 8 ilk çıktığı günden buyana birçok konuda eleştirilse de yayınlanacak olan 8.1 güncellemesi ile birlikte Microsoft'un birçok değişiklik yaparak eleştirilere cevap vereceği söyleniyordu. 

26 Haziranda düzenlenecek olan Microsoft Build geliştirici konferansında kullanıma sunulacak Windows 8.1 güncellemesinden önce Microsoft dün yayınladığı video ile birlikte Windows 8.1'de ne gibi değişiklikler var duyurmuş oldu.

Kısaca ne gibi deşiklikler var dersek ;

      • Herkesin merakla beklediği "Başlat" butonu geri gelmemiş gibi duruyor,
      • Uygulamaları Kategorize edebilme özelliği,
      • Birden fazla uygulama Tile' larını seçip aynı anda taşıyabilme,
      • Metro arayüzünde hareketli duvar kağıdı özelliği,
      • Metro arayüzünde bulunan her bölümün tema rengini değiştirebilme,
      • Yenilenmiş Skydrive uygulaması
      • Denetim Masası'ndan yapılan bütün işlemleri yeni eklenen Ayarlar bölümünden yapabilme,
      • Lock Screen'de hareketli arka plan resimleri ekleme,
      • Daha büyük Tile oluşturabilme özelliği,
      • Metro arayüzde iken ekranı aşağıdan yukarıya doğru çektiğinizde açılan "All Apps" sayfası,
      • Uygulamaları Kategorize edebilme özelliği,
      • Yeni Search uygulaması ile birlikte aranan her kelimeyle ilgili bulunan sonuçların kullanıcıya kategorilenmiş olarak sunulması,

 

  

"Xap packaging failed. Object reference not set to an instance of an object" Hatası

Windows Phone uygulamalarında "Xap packaging failed. Object reference not set to an instance of an object." hatası aldığınızda sorunun nedeni büyük olasılıkla uygulama içerisinde daha önceden var olan bir resim dosyası yada o tür bir dosyanın silinmiş olmasıdır.

 

 

 

Örnek olarak sol tarafta resimde olduğu gibi banner.png dosyası bulunduğu klasörden silinmiş ancak solution'da halen bulunmaktadır. Çözüm; bu dosyayı solution içerisinden de silmektir.

 

 

Windows Phone Bing Map Kullanımı

Windows Phone Bing Map Kullanımı        

Windows Phone’da içerisinde harita kullanımını gerektiren bir uygulama geliştirmek istediğinizde Bing Map Apı lerinden kolaylıkla yararlanabilirsiniz. Öncelikle ilk yapmanız gereken geliştireceğiniz uygulama için Bing Map Key almanız. Bunun için ilk olarak

 https://www.bingmapsportal.com/ sitesine giderek var olan Microsoft hesabı yada yeni hesap oluşturarak giriş yapmalısınız

sonrasında sol tarafta bulunan menüden Create or view keys ‘e tıklayıp


Gerekli yerleri doldurduktan sonra create key butonuna tıklıyoruz.


Uygulama için bir adet Key oluşuturyoruz ve bu Key’i sonrasında uygulama içerisinde Map kontrolünün içerisine atıyoruz.


Windows Phone uygulamamızın Design sayfasına bir adet Map Kontrolü atıyoruz ve CredentialsProvideriçerisine oluşturmuş olduğumuz Key’i yazıyoruz.

  <Maps:Map Name="mymap" CredentialsProvider="BinMapKey" Width="480" Height="300" VerticalAlignment="Bottom"/>

 

 

Gerekli işlemleri yaptıktan sonra uygulamamızı çalıştırıyoruz ve daha önceleri geliştirmiş olduğumda Son Depremler uygulamasında ki BingMap’in ekran görüntüsü aşağıda olduğu gibidir.

 

Windows Phone SmsComposeTask Kullanımı (Uygulama'dan SMS yollama)

Windows Phone'da uygulama içerisinden SMS göndermek istediğinizde SmsComposeTask kontrolünü kullanabilirsiniz. Daha öncesinde geliştirmiş olduğum Kandil,Bayram SMS uygulamasında da kullandığım kodlar aşağıda mevcuttur.

            SmsComposeTask myTask= new SmsComposeTask();
            myTask.To = " ";  //Sms'in gönderileceği numara
            myTask.Body  ="Message";  //Sms'in içeriği
            myTask.Show();         //Task'i çalıştırdığımız yer