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

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);
}

‪Microsoft‬ .NET ‪Framework‬ çekirdek kodlarını ‪github‬’da paylaşmaya başladı

Şahsım adına yıllardır Microsoft’un bir çıkmazda olduğunu bunun da gerekçesinin son 4-5 yıldır dişe dokunur yeni bir paradigma ortaya çıkaramamalarına bilhassa da bu süreçte mobil dünyadaki gelişmeleri ıskalamış olmalarına bağlıyor bunu da her ortamda dillendiriyordum. Hatta bu gidişin Microsoft’un başına zamanında ‪#‎IBM‬’in başına gelen şeyi getireceğini söylüyordum. Sanırım son kertede yaşanan pratik beni haklı çıkardı.

Bu sözlerime bakıp da beni bir Microsoft düşmanı vs diye nitelendirmeyin zira 2002’den beridir .NET üzerine de eğitimler veren Microsoft’un üst üste 7 kez ‪#‎MVP‬ unvanı verdiği, ‪#‎INETA‬ (uluslararası .net birliğinde) ortadoğu afrika ve Türkiye başkanlıkları yapmış birisiyim. Halen de çalıştığım üniversitede ‪#‎Android‬ dersleri dışında inatla ‪#‎WindowsPhone‬, ‪‎ASP.NET‬ ‪#MVC‬ gibi dersler de veriyorum. Bu gelişmeyi de kendi adıma Microsoft’un “can havliyle” ‪#‎opensource‬ dünyasından medet ummasına bağlıyorum. Bu sayede Android, IOS, Linux, Macosx gibi sistemlerde uygulama geliştirebilmek ya da GlassFish, JBoss, Apache gibi web server’larda ASP.NET uygulamalarını çalıştırabilmek gibi ütopyaları gerçekleştirebilmek mümkün olacak. Şüphesiz bunu Java ölecek gibi yorumlayıp üzülenler de olmuş ama ben bu tedirginliği pek mantıklı bulmuyorum doğrusu.

Diğer yandan anlam veremediğim şey ise şu; Microsoft zaten yıllardır Framework’ün kaynak kodlarını açık tutuyordu hatta ‪#‎Mono‬, ‪#‎Rotor‬ gibi projeler bu şekilde ortaya çıkmıştı. Hatta Microsoft yıllardır  “dotnet” ismini bir marka gibi konumlamaktan vazgeçip ürün gibi konumlamayı seçmişti. Yani dotnet bir selpak değil kağıt mendildir vurgusunu yapıyordu. Diğer taraftan bu altyapının standartlarını ise CLI (Common Language Infrastructure) adı altında standardizasyona sokmuştu (ECMA – 335 standartları).

http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf

Microsoft’un resmi söylemlerine göre Mono’nun ayrı bir kod tabanı olduğu yani onun sıfırdan yazıldığı rotor’un ise open source lisansının olmadığı ve bazı uyumsuzluklarının olduğu yönünde. Bu noktada özellikle NuGet ve sıra dışı programlama vurgusu yapıyor. Enteresan noktalardan birisi de Microsoft’un bu konuda XAMARINE isimli firmayla bir tür ortak çalışma yapıyor olması. Malumunuzdur bu firma monodroid, monotouch gibi android ve ios üzerine .net ile uygulama geliştirmenin yolunu açan cross platform araçları geliştirmişti.

Yani “sanki” bütünüyle yeni olmayan bir durumu Microsoft’un çok yeni birşey yapmış gibi bir PR malzemesi haline daha getirmeye çalıştığını düşünüyor, sizlerin de yorumlarını merak ediyorum. Bu arada kodlar aşağıdaki adrese “kısmen” upload edilmiş. https://github.com/dotnet/corefx