WindowsPhone FM Radio

Windows Phone’un ilginç özelliklerinden birisi de bu. Android ve iOS ‘ta olmayan bu özellik Windows Phone’ların donanımsal olarak aynı zamanda bir radyo alıcısına sahip olması. İşte programatik olarak kullanımı:

FMRadio rd = FMRadio.Instance;
rd.PowerMode = RadioPowerMode.On;
rd.Frequency = 90.8;
rd.CurrentRegion = RadioRegion.Europe;

Reklamlar

WindowsPhone Bing Map Kullanımı

Kaynakça: Bahçeşehir Üniversitesi WindowsPhone Ders Notları 2015 Aykut TAŞDELEN

Windows Phone uygulamalarında GPS ve harita kullanımını ele alan bu yazıda Microsoft Bing Map servisi kullanılmıştır.

GPS Verilerinin Alınması

GeoCoordinate isimli sınıf enlem, boylam, rakım, hız gibi gps verilerini temsil eder. GPS’ten gelen verileri dinleyen observe eden sınıf ise  GeoCoordinateWatcher isimli sınıftır. Bu sınıfın Star() fonksiyonu söz konusu işlemi başlatır ve gps verisi elde edildikçe PositionChanged eventi raise eder. Bu event handle edilerek gps verileri elde edilebilir. Örneğin;

public partial class MainPage : PhoneApplicationPage
 {
 public MainPage()
 {
 InitializeComponent();
 GeoCoordinateWatcher gps = new GeoCoordinateWatcher();
 gps.PositionChanged += Gps_PositionChanged;
 gps.MovementThreshold = 1; // eşik değer 1 mt
 gps.Start();
 }
private void Gps_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
 if (e.Position != null)
 {
 String rakim = e.Position.Location.Altitude + " mt";
 String hiz = e.Position.Location.Speed + " km/h";
 String enlem = e.Position.Location.Latitude.ToString();
 String boylam = e.Position.Location.Longitude.ToString();
txt.Text = rakim + "\n\r" + enlem + "\n\r" + boylam + "\n\r" + hiz;
}
 else
 {
 MessageBox.Show("Lokasyon alınamadı"); 
 }
 }

Harita Gösterimi

Öncelikle aynı GoogleMap kullanımında olduğu gibi BingMap servisine authentication amacıyla bir key alınmalıdır. Bunun için Microsoftun ilgili web sayfaları kullanılmalıdır. Daha sonra sayfada aşağıdaki Map kontrolü kullanılmalıdır:

xmlns:maps=”clr-namespace:Microsoft.Phone.Maps.Controls;assembly=Microsoft.Phone.Maps”

<Maps:Map CredentialsProvider=”Ar1B0kYzsWfIva_5AA6QzN5vOqHcS28yW5FJzcVhaSDrSXOM5fYkt3yR4b_cevZ9″
Name=”harita” Height=”768″ Width=”480″/>

CredentialsProvider property’si api key bilgisini taşıyarak bing map servisiyle iletişimi sağlar.

public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
GeoCoordinateWatcher gps = new GeoCoordinateWatcher();
gps.PositionChanged += Gps_PositionChanged;
gps.MovementThreshold = 1;
gps.Start();

harita.Center = new GeoCoordinate(41.01, 28.59, 0);
harita.ZoomLevel = 13;
}

private void Gps_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
if (e.Position != null)
{
harita.Center = e.Position.Location;
}
else
{
MessageBox.Show(“Lokasyon alınamadı”);
}
}
}

Windows_Phone_Bing_Map

Dikkat : GPS verisi alabilmek için cihazın konum seçeneğini açınız, harita hizmeti için ise internet bağlantınız olmalıdır.

 

 

 

 

 

Windows Phone Screen Capture

Aşağıdaki kod örneği ekranın o anki görüntüsünü yakalayıp bir Image üzerinde göstermektedir.

private void btnCapture_Click(object sender, RoutedEventArgs e)
{
WriteableBitmap wb = new WriteableBitmap(
(int) this.ActualWidth, (int) this.ActualHeight);
wb.Render(this, null);
wb.Invalidate();
img.Source = wb;

}

Windows Phone Accelerometer Sensor Kullanımı

WindowsPhone cihazları 3 eksende ve m/sn2 cinsinden ivme ölçebilen sensöre sahiptir. Accelerometer isimli sınıfla temsil edilen bu sensör, Start() fonksiyonu çağrıldığı zaman okuduğu değerleri CurrentValueChanged isimli eventi raise ederek dış dünyaya iletir. Bu event uygun bir handler fonksiyon ile handle edilirse ikinci parametresi üzerinden (SensorReading.Acceleration property'si ile) sensör verileri elde edilebilir.

Sensörden veri okuma işlemi GUI thread'ten ayrı bir thread'te gerçekleştirildiği için event handler fonksiyonda GUI thread'e ait nesnelelere (örnekteki txt isimli TextBlock gibi) erişim cross thread operation hatası ile sonuçlanır. Bu nedenle elde edilen veriler kontrolün Dispatcher property'si ve bir callback fonksiyon yardımıyla kontrole yazılmıştır. 
 
public partial class MainPage : PhoneApplicationPage
 {
 private String sensorVerisi = "";
 
 public MainPage()
 {
 InitializeComponent();
 Accelerometer acc = new Accelerometer();
 acc.CurrentValueChanged += Acc_CurrentValueChanged;
 acc.Start();
 }

 private void Acc_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
 {
 sensorVerisi = "";
 sensorVerisi += "X:" + e.SensorReading.Acceleration.X + "\n\r";
 sensorVerisi += "Y:" + e.SensorReading.Acceleration.Y + "\n\r";
 sensorVerisi += "Z:" + e.SensorReading.Acceleration.Z + "\n\r";
 txt.Dispatcher.BeginInvoke(new Action(DisplayCallBack)); 
 }
 
 public void DisplayCallBack()
 {
 txt.Text = s;
 }
 }

Dikkat : Yeni SDK versiyonlarında ReadingChanged isimli event artık kullanılmamaktadır.

Kaynakça: Bahçeşehir Üniversitesi, WindowsPhone Programlama Dersi Notları, Aykut TAŞDELEN 2015

Windows Phone 8.1 Page Navigation

Kaynakça: TAŞDELEN Aykut. Windows Phone Dersi Notları, Bahçeşehir Üniversitesi 2015

Visual Studio 2015 versiyonu ile birlikte Windows Phone tarafında da birtakım değişiklikler yaşanmıştır. Sözgelimi; geçmişte sayfa navigasyonu için NavigationService sınıfının Navigate() metodu aşağıdaki gibi kullanılmaktaydı:

NavigationService.Navigate(new Uri(“/Other.xaml”, UriKind.Relative));

Oysa yeni versiyonda bu sınıf yerini Frame isimli sınıfa bırakmıştır.

Frame.Navigate(typeof(Sayfa2), new Urunler());

Bu sınıf yine Navigate() isimli bir fonksiyon içermektedir. Bu fonksiyon ilk parametresine gidilmek istenilen sayfaya ait sınıfın tür bilgilerini (metadatasını) Type sınıfı türünde bir referans ile almakta, 2. parametresine ise şayet gönderilmek istenen bir bilgi var ise o bilgiyi Object sınıfı türünde almaktadır. Bu örnekte Sayfa2 isimli sayfaya Urunler isimli bir nesne gönderilmektedir.

Sayfa2’ye gelindiğinde ise OnNavigatedTo() sanal fonksiyonu otomatik olarak çalışmaktadır. Bu fonksiyonun NavigationEventArgs türündeki parametresinin Parameter isimli Object türündeki propertysi ise önceki sayfadan gönderilen bilgiyi temsil etmektedir. Dolayısıyla bu bilgi alınıp doğru türe açıkça cast edilerek kullanılabilir.

protected override void OnNavigatedTo(NavigationEventArgs e)
{
Urunler container = (Urunler) e.Parameter;

// ….
}

}

CSharp await async keyword Windows Phone MessageBox MessageDialog

Kaynakça: TAŞDELEN Aykut, Bahçeşehir Üniversitesi, Windows Phone Programlama Dersi Notları

CSharp await async keyword ile Windows Phone MessageBox MessageDialog Kullanımı

Visual Studio 2015 güncellemesi sonrasında Windows Phone tarafında da birtakım değişiklikler yaşanmıştır. Sözgelimi mesaj kutusu diyaloğu görüntülemek için geçmişte MessageBox.Show() metodu kullanılırken bu güncelleme sonrasında MessageBox isimli sınıfın yerini MessageDialog sınıfına bıraktığı gözlemlenmektedir. En primitif haliyle bir mesaj kutusu diyaloğu aşağıdaki gibi görüntülenebilir:

// btnTest isimli bir düğmeye tıklandığı varsayılırsa

private async void btnTest_Click(object sender, RoutedEventArgs e)
{

MessageDialog dlg = new MessageDialog(“Kayıt gerçekleşti”, “CSD”);

var result = await dlg.ShowAsync();

}

Bu şekliyle üzerinde sadece başlık ve mesaj bir de varsayılan durumda Kapat yazan bir düğme ile mesaj kutusu görüntülenir.

Burada dikkat edilmesi gereken ayrıntı; ShowAsync() isimli metodun asenkron bir işlem yapıyor olması nedeniyle çağrımında await anahtar sözcüğünün kullanılmış olması, buna bağlı olarak da butona ait event handler’ın da async anahtar sözcüğü ile tanımlanmış olmasıdır.

await anahtar sözüğü; yapılmakta olan asenkron işlemin sonuna kadar beklenmesini sağlar. Bu anahtar sözcüğün kullanıldığı bir çağırma ifadesin yer aldığı fonksiyonlar ise async anahtar sözcüğü kullanılarak tanımlanmak zorundadırlar.

Şayet mesaj kutusu diyaloğu üzerine birden çok buton (en fazla 2 adete izin verilmiştir) eklenmek ve butonlara basılarak birtakım eylemler yaptırılmak istenilirse bu kez:

private async void btnTest_Click(object sender, RoutedEventArgs e)
{
MessageDialog dlg = new MessageDialog(“Kayıt gerçekleşti”, “CSD”);

dlg.Commands.Add(new UICommand() { Id = “1”, Label = “Kaydet”});
dlg.Commands.Add(new UICommand() { Id = “2”, Label = “Vazgeç” });

IUICommand cmd = await dlg.ShowAsync();

switch (cmd.Id.ToString())
{
case “1”:
grd.Background = new SolidColorBrush(Colors.Blue);
break;
case “2”:
grd.Background = new SolidColorBrush(Colors.Red);
break;
}
}

Bu örnekte; List<IUICommand> türündeki Commands isimli property’e IUICommand interface’ini implemente eden UICommand türünde iki adet nesne eklenmiş ve Label property’lerine atanan değerler ile butonların üzerindeki metinler belirlenmiş ayrıca Id olarak da “1 ve 2” değerleri kullanılmıştır.

ShowAsync() metodunun dönüş değeri kullanıcının hangi butona basarak diyaloğu kapattığı bilgisini temsil eder. Bu bağlamda örnekte dönüş değeri üzerinden Id’ye bakılarak hangi buton ile diyaloğu kapatıldığı anlaşılmakta ve ona göre sembolik bir işlem gerçekleştirilmektedir. Aynı şey farklı bir yöntem ile aşağıdaki gibi de yapılabilirdi:

private async void btnTest_Click(object sender, RoutedEventArgs e)
{
MessageDialog dlg = new MessageDialog(“Kayıt gerçekleşti”, “CSD”);
dlg.Commands.Add(new UICommand(“Kaydet”,  new UICommandInvokedHandler(Save)));
dlg.Commands.Add(new UICommand(“Vazgeç”, new UICommandInvokedHandler(Cancel)));
await dlg.ShowAsync();
}

public void Save(IUICommand cmd)
{
grd.Background = new SolidColorBrush(Colors.Green);
}

public void Cancel(IUICommand cmd)
{
grd.Background = new SolidColorBrush(Colors.Yellow);
}

WPF, Windows Phone Command Binding Event Handling

WPF ve Windows Phone’da Command Binding İşlemiyle Event Handling

Aşağıdaki uygulama Windows Phone için yazılmıştır. Windows Phone, WPF/Silverlight altyapısı üzerine geliştirilmiş olduğu örnekte kullanılan bu özellik WPF ile geliştirilen masaüstü veya Silverlight ile geliştirilen web uygulamalarında da kullanılabilir.

NOT : Bu yazı Aykut TAŞDELEN’in C++ Java ve C# ile UML ve Dizayn Paternleri kitabından alıntıdır izinsiz kullanılıp alıntı yapılamaz ! Konunun devamı söz konusu kitapta yer almaktadır.

WPF’te event handling konusuna command patern’i bağlamında yeni bir boyut getirilmiştir. System.Windows.Input.ICommand interface’i ile command patern’i uygulanarak event handling işlemi gerçekleştirilebilir.

public interface ICommand

{

event EventHandler CanExecuteChanged;

bool CanExecute(object parameter);

void Execute(object parameter);

}

Command nesneleri bir eyleme ilişkin lojiği enkapsüle eder. Böylece uygulamanın çeşitli unsurları bir eylemi gerçekleştirmek istediğinde bunu ilgili command nesnesi yoluyla yapabilir. Aşağıdaki örnekte ICommand interface’inin gerçekleştirimi olan TestCommand sınıfı görülmektedir.

namespace WPhoneCommandBinding

{

public class TestCommand : System.Windows.Input.ICommand

{

public bool CanExecute(object parameter)

{

return true;

}

public event EventHandler CanExecuteChanged;

public void Execute(object parameter)

{

MessageBox.Show(“Test : ” + parameter);

CanExecuteChanged(this, new EventArgs());

}

}

}

Bu sınıfın Execute() metodu parametresine gönderilen bilgiyi mesaj kutusu içinde göstermektedir. Ancak bu sınıfa ait bir nesnenin kullanımı ve Execute() metoduna parametre gönderilişi oldukça ilginçtir zira XAML içerisinden dekleratif şekilde yapılmaktadır.

<phone:PhoneApplicationPage

xmlns:tst=”clr-namespace:WPhoneCommandBinding”>

<StackPanel>

<StackPanel.Resources>

<tst:TestCommand x:Key=”komut” />

</StackPanel.Resources>

<Button
Command=”{StaticResource komut}”
CommandParameter=”Deneme123″
Name=”btnTest” Content=”Test” />

</StackPanel>

</phone:PhoneApplicationPage>

XAML kodu incelenirse öncelikle WPhoneCommandBinding namespace’inin tst kısaltmasıyla tanımlandığı daha sonra buradaki TestCommand türünde komut isimli bir kaynak tanımlanıp bu kaynağın da daha sonra Button’un Command property’sine bind edilerek kullanıldığı görülmektedir. Örnek emülatörde çalışırılıp denendiğinde ise ekrana gelen mesaj kutusu içerisinde “Deneme123” metninin sunulduğu görülecektir.