20 Kas 2009 Silverlight 4 Beta ile Yazdırma (Printing) İşlemi Kategori: Silverlight Etiketler: Silverlight 4Silverlight 0 Yorum Silverlight 4 Beta ile birlikte gelen yeniliklerden biri de silverlight uygulamarına gelen yazdırma (printing) desteği. Silverlight 4 Beta ile birlikte yazdırma işlemi yapmak için System.Windows.Printing namespace’i altında yer alan PrintDocument sınfını kullanacağız. Bu sınıf ile uygulamanın tamamını yada belli bir UI Elementin yazdırılmasını sağlayabiliyoruz. Şimdi bu sınıfa ait üyeleri detaylı olarak inceleyelim.PrintPage Event’i, yazdırılacak olan UI elementin belirlendiği event.StartPrint Event’i, yazdırma işlemi başladığında çalışacak olan event.EndPrintEvent’i, yazdırma işlemi sona erdiğinde yada herhangi bir hata meydana geldiğinde çalışacak olan event. (Kartuş bittiğinde yada yazıcıya ulaşılamadığında vb. gibi sebeplerden hata alabiliriz)DocumentName özelliği, yazdırma kuyruğunda (print queue) gösterilen dokümanın adı. Print Metodu, print dialog ekranını açarak yazdırma işleminin başlatılmasını sağlar. Yazdırma işlemini yapacağımız sınıfı ve üyeleri inceledikten sonra örneğimize geçebiliriz. Visual Studio 2010 ile yeni bir silverlight projesi oluşturalım. Ekranımızda bir TextBlock ve bir Button ekleyelim. TextBlock içerisinde yer alan text’i yazıcıya göndererek yazdırılmasını sağlayalım. [XAML] <UserControl x:Class="PrintIslemi.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"Height="200" Width="500"><Grid x:Name="LayoutRoot" Background="White"> <TextBlock Margin="15,16,15,62" TextWrapping="Wrap" FontWeight="Bold" FontSize="40" x:Name="txtMetin">Silverlight İle Yazdırma İşlemi</TextBlock> <Button Height="23" HorizontalAlignment="Left" Margin="413,165,0,0" x:Name="btnYazdir" Content="Yazdır" VerticalAlignment="Top" Width="75" /></Grid></UserControl> Şimdi Yazdırma işlemine başlayabiliriz. PrintDocument sınıfını kullanabilmemiz için ilk olarak System.Windows.Printing namespaceni ekleyelim ve PrintDocument sınıfının bir örneğini alalım. Yazdırma işlemi butona tıkladığında başlayacak. [C#] using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using System.Windows.Printing; // Unutmuyoruz !namespace PrintIslemi{ public partial class MainPage : UserControl { // Yazdırma işlemi için PrintDocument sınıfının örneğini alalım. private PrintDocument PrintDocument = new PrintDocument(); public MainPage() { InitializeComponent(); PrintDocument.StartPrint += new EventHandler<StartPrintEventArgs>(PrintDocument_StartPrint); PrintDocument.EndPrint += new EventHandler<EndPrintEventArgs>(PrintDocument_EndPrint); PrintDocument.PrintPage += new EventHandler<PrintPageEventArgs>(PrintDocument_PrintPage); btnYazdir.Click += new RoutedEventHandler(btnYazdir_Click); } void PrintDocument_PrintPage(object sender, PrintPageEventArgs e) { e.HasMorePages = false; // Yazdırılacak başka sayfa varmı? e.PageVisual = txtMetin; // Herhangi bir UI element; e.PrintableArea = new Size(txtMetin.Width, txtMetin.Height);// Yazıdırılacak alanın size’ı } void btnYazdir_Click(object sender, RoutedEventArgs e) { PrintDocument.DocumentName = "Silverligt 4 Beta ile Yazdırma İşlemi";// Yazdırma kuyruğunda gösterilecek olan metin PrintDocument.Print();// Yazdırma işlemini için print dialog ekranını açar ve yazdırma işleminin başlatılmasını sağlar. } void PrintDocument_EndPrint(object sender, EndPrintEventArgs e) { // Yazdırma işleminde bir hata geldiğinde yada sona erdiğinde çalışacak olan event.. if (e.Error == null) // Hata yoksa { MessageBox.Show("Yazdırma işlemi sona erdi..."); } else // Hata varsa { MessageBox.Show("Bir hata meydana geldi..."); } } void PrintDocument_StartPrint(object sender, StartPrintEventArgs e) { // Yazdırma işlemi başladığında çalışacak olan event.. MessageBox.Show("Yazdırma işlemi başlıyor..."); } }} Yazdırma işlemini başlatmak için butona tıklayalım. Yazıcımız var ama biz yine de Microsoft XPS Document Writer’ı seçelim :)Yazdırma kuyruğuna bakacak olursak kuyruktaki dökümanın adını PrintDocument sınıfının DocumentName özelliği ile belirtmiştik. Şimdi XPS dökümanını açalım bakalım. Bu kadar JBu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;) Sem GÖKSU www.semgoksu.com | www.yazilimgunlugu.com sem.goksu@yazilimgunlugu.com Kaynaklar Silverlight 4 Beta SDK
19 Kas 2009 Silverlight 4 Beta ile WebCam ve Mikrofon Erişimi Kategori: Silverlight Etiketler: Silverlight 4Silverlight 8 Yorum Merhaba arkadaşlar bu makalemizde Silverlight 4 Beta ile birlikte gelen mikrofon ve webcam gibi capture aygıtlarına nasıl erişileceğine bakacağız.Silverlight’ın ilk üç versiyonunda müthiş yenilikler geldi ve kullanım oranı her versiyon ile birlikte katlanarak arttı. Hala eksik olan birşeyler vardı, bunların başında WebCam ve Mikrofon erişimi geliyordu. Silverlight 4 Beta ile birlikte müjdeli haber geldi ve artık silverlight ile WebCam ve Mikrofon erişimi mümkün! Hemde kullanımı son derece basit. Uygulamaya geçmeden önce Silverlight 4 Beta için gerekli olan araçları indirip kuralım.- Visual Studio 2010 Beta 2 yada Visual Web Developer Express 2010 Beta 2 - Silverlight 4 Beta Tools for Visual Studio 2010 - Windows Runtime yada Mac Runtime- Microsoft Expression Blend for .NET 4 PreviewAraçları kurduktan sonra örneğimiz için Visual Studio 2010 ile yeni bir Silverlight projesi başlatalım. Formumuza Webcam’den gelen görüntüyü göstermek için Rectangle nesnesi, Ses ve kamera aygıtlarını listelemek için iki adet combobox nesnesi, camerayı başlatmak-durdurmak ve cameradaki görüntünün resmini almak için bir adet button ve image nesnesi ekleyelim. XAML kodumuz aşağıdaki gibi oldu. [XAML]<UserControl xmlns=" http://schemas.microsoft.com/winfx/2006/xaml/presentation" mlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Class="WebCamMicrofon.MainPage" Height="340" Width="550"> <Grid x:Name="LayoutRoot" Background="White"> <Rectangle Fill="White" Width="400" Height="300"Stroke="Black" Margin="10,20,130,20" x:Name="player"/> <ComboBox HorizontalAlignment="Right" VerticalAlignment="Top" Width="120" Margin="0,20,8,0" x:Name="cmbAudioSources"/> <ComboBox HorizontalAlignment="Right" Margin="0,54,8,0" VerticalAlignment="Top" Width="120" x:Name="cmbVideoSources"/> <Button Content="Fotoğraf Çek" Width="104" Margin="422,0,24,175" x:Name="btnTake" Height="22" erticalAlignment="Bottom" /> <Button Content="Durdur" HorizontalAlignment="Right" VerticalAlignment="Top" Width="104" x:Name="btnStop" Margin="0,115,24,0"/> <Button Content="Oynat" HorizontalAlignment="Right" VerticalAlignment="Top" Width="104" x:Name="btnStart" Margin="0,89,24,0"/> <Image Height="90" HorizontalAlignment="Left" Margin="422,193,0,0" Stretch="Fill" x:Name="image" VerticalAlignment="Top" Width="120" /></Grid></UserControl> CaptureSource nesnesi, sistemdeki görüntü ve sesin istemcinin browserında yayınlanmasını sağlar. (Hatta yayın sırasında bir karenin yakalanmasını sağlıyor J).CaptureSource nesnesinin Start metodunu kullanarak görüntünün capture edilmesini sağlıyoruz. Stop medodu ise capture işleminin durdurulmasını sağlıyor. State isimli enum ile CaptureSource nesnesinin capture durumunu kontrol edebiliriz. AudioCaptureDevice özelliği sistemde yer alan ilişkili bir ses aygıtını, VideoCaptureDevice özelliği de sistemde yer alan ilişkili bir görüntü aygıtını temsil eder. CaptureDeviceConfiguration nesnesi, sistemde yer alan ses ve görüntü aygıtlarına erişmemizi sağlar. Ayrıca kullanıcının bu aygıtlara erişime izin verip vermediğini kontrol eden üyeleri vardır. [C#] public partial class MainPage : UserControl{ public CaptureSource CaptureSource { get; set; } public MainPage() { InitializeComponent(); // Kontrolllerin eventlerini oluşturalım this.Loaded += new RoutedEventHandler(MainPage_Loaded); this.btnStart.Click += new RoutedEventHandler(btnStart_Click); this.btnStop.Click += new RoutedEventHandler(btnStop_Click); this.btnTake.Click += new RoutedEventHandler(btnTake_Click); } void MainPage_Loaded(object sender, RoutedEventArgs e) { // İlk yükleme de sistem de yer alan aygıtları ilgili kontrollere yüklüyoruz. AygitlariYukle(); } private void AygitlariYukle() { // CaptureSource Nesnesinin örneğini alalım. CaptureSource = new CaptureSource(); // Ses aygıtlarını combobox'a yükleyelim. GetAvailableAudioCaptureDevices() Metodu sisteme yer alan ses aygıtlarını getiriyor. cmbAudioSources.ItemsSource = CaptureDeviceConfiguration.GetAvailableAudioCaptureDevices(); cmbAudioSources.DisplayMemberPath = "FriendlyName"; // Kamera aygıtlarını combobox'a yükleyelim. GetAvailableVideoCaptureDevices() Metodu sisteme yer alan kamera aygıtlarını getiriyor. cmbVideoSources.ItemsSource = CaptureDeviceConfiguration.GetAvailableVideoCaptureDevices(); cmbVideoSources.DisplayMemberPath = "FriendlyName"; } void btnStart_Click(object sender, RoutedEventArgs e) { // CaptureSource nesnesi başlatılmadıysa... if (CaptureSource.State != CaptureState.Started) { // Seçtiğimiz ses aygıtını CaptureSource nesnesinin AudioCaptureDevice özelliğine bağlayalım. CaptureSource.AudioCaptureDevice = (AudioCaptureDevice)cmbAudioSources.SelectedItem; // Seçtiğimiz kamera aygıtını CaptureSource nesnesinin VideoCaptureDevice özelliğine bağlayalım. CaptureSource.VideoCaptureDevice = (VideoCaptureDevice)cmbVideoSources.SelectedItem; // VideoBrush nesnesi oluşutralım ve SetSource metoduna CaptureSource'u parametre olarak geçelim. VideoBrush vb = new VideoBrush(); vb.SetSource(CaptureSource); // Player isimli kontrol de kameradan gelen görüntüyü gösterelim... player.Fill = vb; // İstemci aygıtlara erişimi izni verdiyse capture işlemini başlatalım. if (CaptureDeviceConfiguration.AllowedDeviceAccess || CaptureDeviceConfiguration.RequestDeviceAccess()) { CaptureSource.Start(); } } } void btnStop_Click(object sender, RoutedEventArgs e) { // Kamera görüntüsünü capture ediliyorsa. if (CaptureSource.State != CaptureState.Stopped) { // Capture işlemini durduralım. CaptureSource.Stop(); } } void btnTake_Click(object sender, RoutedEventArgs e) { // Kamera görüntüsü capture ediliyorsa. if (CaptureSource.State== CaptureState.Started) { CaptureSource.AsyncCaptureImage((rsm) => { image.Source = rsm; // Yakalanan kamera görüntüsünü Image nesnesine bağlayalım }); } } } Uygulamamızı çalıştırdığımızda aşağıdaki gibi bir uyarı çıkacaktır. (Kamera ve Ses aygıtınıza erişime izin vermemizi istiyor) Evet diyerek devem edelim. Sistemimizde yer alan ses ve kamera aygıtını seçerek kameradan görüntü almaya başlayalım. Oynat dediğimizde:)Birde resim yakalayalım :)Bu makalenin de sonuna geldik başka bir makale de görüşmek üzere. Silverlight ile kalın ;)Örnek uygulama için tıklayınızSem GÖKSU www.semgoksu.com | www.yazilimgunlugu.com sem.goksu@yazilimgunlugu.com Kaynaklar Silverlight 4 Beta SDK
18 Kas 2009 Silverlight 4 Beta Duyuruldu ! Kategori: Yazılım Etiketler: SilverlightSilverlight 4 0 Yorum PDC 2009 ile birlikte bir bomba haber bekliyordum ama bu bombanın Silverlight ile patlayacağını hiç tahmin bile etmiyordum :) Silverlight 4 Beta ile ilgili detayları incelemek için aşağıdaki adresi kullanabilirsiniz.http://www.silverlight.net/getstarted/silverlight-4-beta/
19 Oca 2009 Silverlight Layout Kontrolleri Kategori: Silverlight Etiketler: SilverlightSilverlight 4 2 Yorum Merhaba arkadaslar, bu makalemizde silverlight uygulamalarinda kullanilan Layout kontrollerini (StackPanel, Grid, Canvas) inceliyor olacagiz.Layout Kontrolü Nedir?Layout kontrolleri silverlight uygulamalarinda yer alacak kontrollerimizin uygulama üzerinde nerede, nasil duracagini ve bu kontrollerin ekranda nasil gösterilecegini belirleyen kontrollerdir. Bu kontroller kullanicinin tarayicisina göre yeniden boyutlandirilabilir yada sabit bir sekilde tarayici üzerinde gösterilebilirler. Yine ayni sekilde layout kontrolleri içerisinde yer alan diger kontroller de içinde bulundugu kontrole göre boyutlandirilabilir yada sabit bir sekilde gösterilebilirler. Silverlight içerisinde kullanabilecegimiz 3 adet layout kontrolü var, StackPanel, Grid ve Canvas kontrolleri.Bu üç kontrol de abstract bir sinif olan Panel sinifindan türemislerdir. Istersek Panel sinifini inherit ederek kendi panel kontrolümüzü de yazabiliriz.publicclass StackPanel : Panelpublic class Grid : Panelpublic class Canvas : PanelÜç layout kontrolüde UIElementCollection tipinde Children isimli bir koleksiyona sahiptirler. Bu sayede bu koleksiyonun içerisine istedigimiz kadar UIElement tipinde kontrol ekleyebiliriz. StackPanel stackpanel = new StackPanel();Grid grid = new Grid();Canvas canvas = new Canvas();stackpanel.Children.Add(grid);grid.Children.Add(canvas);canvas.Children.Add(UIElementControl);StackPanelStackPanel genel olarak içerisinde yer alacak kontrollerin belli bir düzende(dikey,yatay) dizilmesi istendiginde tercih edilir. Örnegin bir sayfalama kontrolü yapmak istedigimiz de stack panel içersinde butonlar atarak bu butonlarin stack panel içerisinde yan yana siralanmasini saglayabiliriz. (Yan yana dedik ama StackPanel içerisindeki kontrolleri alt alta da dizebiliriz) StackPanel’in Orientation özelligini degistirerek içerisinde yer alan kontrollerin dikey ya da yatay olarak dizilmesini saglayabiliriz. Orientation özelligi vertical ve horizontal degerleri alabilmektedir.ÖrneginOlusturdugumuz XAML kodunu inceleyecek olursak,<UserControl x:Class="_00_MerhabaSilverlight.Page" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="518" Height="50" Background="#FFF41313" x:Name="UserControl" HorizontalAlignment="Right"><StackPanelBackground="#FFFFFFFF" Orientation="Horizontal"><Button Content="1"/><Button Content="2" RenderTransformOrigin="2.977,0.5"/><Button Content="3"/><Button Content="4"/><Button Content="5"/><Button Content="Sonraki >>"/><Button Content="En Son >>"/></StackPanel></UserControl>Not: Bir User Control içerisinde sadece bir root elementi bulunabilir. Bununda nedeni UserControl nesnesi içerisine sadece tek bir content alabiliyor olmasindandir. Asagidaki gibi bir kullanim geçersizdir.GridGrid kontrolü HTML’de kullandigimiz tablo yapisina benzer fakat etiket yapisi farklidir. Grid içerisinde sütunlar ve satirlar olusturup içerisine diger kontrolleri yerlestirebiliriz. Grid kontrolü bagli bulundugu UserControl’e göre hareket edebilirlerken istersek sabit genislikte de verilebilir.XAML koduna bakacak olursak…<Gridx:Name="LayoutRoot"Background="White"> <Grid.RowDefinitions> <RowDefinition Height="0.223*"/> // Sabit deger yerine Auto vererek yüksekligin otomatik olarak degistirilmesini saglayabiliriz. <RowDefinition Height="0.777*"/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="0.245*"/> <ColumnDefinition Width="0.755*"/> // Sabit deger yerine Auto vererek genisligin otomatik olarak degistirilmesini saglayabiliriz. </Grid.ColumnDefinitions> <Rectangle Fill="#FF9C0000" Stroke="#FF000000" Grid.Column="0" Grid.Row="0"/> </Grid>Grid nesnesinin 0 Index numarali Kolonuna ve 0 Index numarali Satirina bir Rectangle nesnesi ekledik. Rectangle nesnesinin özelliklerini asagidaki gibi degistirdigimizde rectangle nesnesinin yerinin degistigini görebiliriz.<Rectangle Fill="#FF9C0000" Stroke="#FF000000" Grid.Column="1" Grid.Row="1"/> CanvasCanvas kontrolü HTML’deki DIV’in position absolute haline benzer yapida bir layout kontrolüdür. Canvas içerisinde yer alacak kontroller Canvas.Left and Canvas.Top (üstten ve soldan mesafeleri) özellikleri belirtilerek canvas kontrolü içerisinde pozisyonyanldirilir. Canvas kontrolünün boyutu degistiginde içerisinde yer alan kontrollerin boyutu degismez. <Canvas Background="#FF0E0C2E"><Rectangle Height="200" Width="200" Fill="#FFC1D039" Stroke="#FF000000" Canvas.Top="25" Canvas.Left="35" RadiusX="20" RadiusY="20"/></Canvas>Yukaridaki örnekte Canvas kontrolü içerisinde bir rectangle nesesi yerlestirdik. Rectangle nesnesi 25px soldan 35px üstten Canvas’in sol üst merkezinden uzaklasmis durumda. Canvasin boyutunu degistirirsek rectangle nesnesinin yerinin degismedigini görebiliriz. <Canvas Background="#FF0E0C2E" Width="600" Height="500"><RectangleHeight="200" Width="200" Fill="#FFC1D039" Stroke="#FF000000" Canvas.Top="25" Canvas.Left="35" RadiusX="20" RadiusY="20"/></Canvas>StackPanel ve Grid içerisine yerlestirilen bir nesne istenirse içerisinde bulundugu nesnenin boyutlarina göre boyutlandirilabilir. Fakat bu durum Canvas için geçerli degildir. Canvas içerisinde yer alan bir nesne her zaman Canvasin Left ve top adindaki dependency özelliklerine göre yerlestirilir, boyutu degismez.Bu makalenin sonuna geldik, baska bir makalede görüsmek dilegiyle. .NET ve Silverlight ile kalin ;)Sem GÖKSU www.semgoksu.com | www.yazilimgunlugu.com sem.goksu@yazilimgunlugu.com Kaynaklarmsdn.comsilverlight.netdaron.yondem.com
15 Oca 2009 Silverlight uygulamasi gelistirmek için ne gerekiyor? Kategori: Yazılım Etiketler: Silverlight 2SilverlightSilverlight 4 2 Yorum Silverlight uygulamasi gelistirmek için ne gerekiyor? * Visual Studio 2008 ve Visual Studio 2008 Service Pack 1.* Visual Studio 2008 için Silverlight Tools (Silverlight Proje templatelerinin VS 2008'e eklenmesini saglayan araç. Içerisinde developer runtime ve SDK'da var.)* Expression Blend 2 ve Expression Blend 2 Service Pack 1(Grafik arayüzeleri olusturmamizi saglayan dizayn araci)* Deep Zoom Composer (Deep Zoom Uygulamasi gelistirmek isterseniz indirmeniz gerekiyor)* Silverlight Toolkit (Açik kaynak kodu ile birlikte hazir silverlight kontrollerinin bulundugu bir paket. Ajax control toolkit gibi kontroller var içerisinde)Tüm bunlari yaptiktan sonra makinamiz silverlight'a hazir. Silverlight'in kendi resmi sitesi olan silverligh.net sitesinde silverlight ile ilgili çalismalari, videolari ve çesitli dökümanlari bulabilirsiniz. Yerli kaynak içinse Daron Yöndem'un blogunu inceleyebilirsiniz.