Her sene 1 Nisan MVP'liğimin bittiği gün :) Şaka gibi değil mi? :)
Biliyorsunuz MVP ünvanı her seferinde senelik olan Microsoft tarafından verilen
bir ünvan bu nedenle bir bitiş tarihi var ve bu nedenle de her sene yenilenmesi
gerekiyor :) Eh benimki bugün yenilendi. 2010 yılında da "Silverlight MVP"si
olarak var olmaya devam edeceğim. Bu gaz ile önümüzdeki dönemde blogda ekstra
hareketlilik göreceğinizden de emin olabilirsiniz :)
Hepinize bu dönemde gösterdiğiniz destek için ayrıca çok teşekkürler. Bilgiyi
paylaşmak ancak paylaşabileceğiniz insanlar oldukça zevkli ve güzel. 2010'da da
daha yapacak çok işimiz var ;) ve güzel sürprizlerim var ;)
Görüşmek üzere.
İki gündür Kahramanmaraş'tayım :) Evet dondurması ve acısı ile ünlü
Kahramanmaraş'tan bahsediyorum. Tabi maalesef acı miktarı konusunda hala benim
istediğim acı biberi bulamadık o ayrı :) Pul biberlerini avuç avuç tadarkenki
halimi komik bulanlar bile oldu. Her neyse, konumuza geri dönelim. İki gündür
Kahramanmaraş'tayım çünkü Sütçü İmam Üniversitesi desteği ile
Kahramanmaraş Ticaret Meslek Lisesi öncülüğünde düzenlenen bir
seminer serisine konuşmacı oldum. Şehre gittiğimde epey şaşırdığımı itiraf
etmeliyim :) Neden olduğunu sanırım aşağıdaki fotoğraf açıklıyordur.

Bu şaşkınlık sonrasında sahneye çıktığım ilk günde Kahramanmaraş Ticaret
Meslek Lisesi'ndeydim. Öğrencilerden gelen sorular ayrı ayrı şaşkınlık seansları
yaşamama neden oldu. İlk soruyu çok net hatırlıyorum :) "Visual Studio 2010
ile bir web projesi yarattığımızda Web.Config neden boş geliyor?"
şeklindeki soru bir an afallamama neden oldu. Karşımda Visual Studio 2010'u
denemiş, web sitesi yaratıp Web.Configi bilerek içindeki değişikliği yakalamış
bir lise öğrencisi var dikkatinizi çekiyorum! Kesinlikle "Efsanevi hareketler
bunlar". Bu öğrencileri yetiştiren ve organizasyona süper faydası olan
"kahramanlarıma", sevgili hocalarımız Çetin Çevik, Yalçın Ateş,
Serdar Temiz'e buradan binlerce teşekkür gönderiyorum!
 Kahramanmaraş Ticaret Meslek Lisesi
İlk günümüzün ilk yarısını Meslek Lisesi'ndeki öğrencilerimizle geçirdik.
Sonrasında ben biraz daha derinlere dalarak hocalarımıza da bir anlatımda
bulundum. Öğrencilerimiz üzülmesin darılmasın ama onlar geçici :) hocalarımız
kalıcı. Bu gibi aktivitelere hocalarımızın katılımı benim için ÇOK değerli çünkü
bilginin daha geniş kitlelere dağılmasını sağlayacak kişiler hocalarımız. İkinci
gün Sütçü İmam Üniversitesi'nde geçtik. Sevgili Yrd.
Doç. Dr. Mehmet Tekerek hocamıza ve üniversite yönetimindeki tüm
dostlara desteklerinden dolayı ayrıca çok teşekkürler. Her iki gün de benim için
çok zevkli ve verimli geçti.
Tekrar aktiviteye katılan herkese milyonlarca teşekkürler! Görüşmek üzere! ;)
DVD veya CD arayüzleri hala bilgisayar dünyasında ciddi bir yere sahip.
İçeriğin paylaşımı adında internet ciddi bir yol almış olsa da hala CD ve DVD
medyalarını kullanarak içeriğin dağıtımı bazı senaryolarda çok daha işlevsel
olabiliyor. Bu gibi durumlarda doğal olarak bir arayüz ile söz konusu içeriği
bir CD veya DVD içerisinde sunmak gerekiyor. Peki bu arayüzü geliştirmek için
hangi teknolojileri kullanabiliriz?
Gelin beraberce sıralayalım;
HTML - Pufff! Flash - ActionScript? Pufff!
WPF - .NET Framework yükletmek? Puff! Silverlight - Oley! İşte bu!
Şaka bir yana :) aslında bir CD veya DVD arayüzü geliştirirken ihtiyacımız
olan şey hem arayüz içerisinde her tür data işlemini yapabilimek hem de güzel
bir arayüz tasarlayabilmektir. Varsayalım bir ürün kataloğu yapıyorsunuz, büyük
ihtimal ile söz konusu ürünler arasında arayüzde arama da yapılabilmelidir. İşte
ufak da olsa bir programlama noktası karşımızda. Olabildiğince rahat
programlamak ve bildiğimiz bir dili kullanmak önemli. HTML ile JavaScript veya
Flash ile ActionScript bir .NET developer için çok da ferah bir gelecek
vaadetmeyecektir. Ayrıca HTML ile zaten güzel bir arayüz, zengin bir kullanıcı
deneyimi sağlamak da pek mümkün değil.
Alternatiflerden bir diğeri WPF olabilir ve aslında çok da güzel olur. Fakat
bu sefer de .NET Framework gereksinimi ile karşı karşıya kalıyoruz. Eh hadi
DVD'nin içine koyalım ama insanların bir DVD arayüzünü görebilmek için .NET
Framework kurup (en az 5dk) makinelerine restart atacaklarından emin misiniz?
Tüm bu senaryonda en güzeli Silverlight! Hem bildiğimiz VB, C# hem Expression
Blend ile süper kullanıcı deneyimi hem de 4MB Runtime ve 5 saniye yükleme
süresi. Hem MAC desteği de var! Eh gönül daha ne ister?
Tamam da şimdi tarayıcıda açtırmak da pek hoş olmuyor!
Kesinlikle! Bir CD veya DVD arayüzünün tarayıcı içerisinde açılması benim en
uyuz olduğum noktalardan birisidir özünde. Neden mi? Çünkü ister istemez bir web
sitesi hissiyatı yaratıyorsunuz ve en azından bende "çok uğraşılmamış" efekti
oluşturuyor. Yani "adamlar web sitesi yapıp koymuş DVD'ye!" gibi abuk bir
yorumun gelmesi olasılığı ciddi yüksek. O nedenle tarayıcıdan kurtulmamız gerek.
HTML Application = HTA!
HTA'larla ilk tanışdığımda "İşte bu" demiştim :) Sanırım SQL 2000'in yükleme
CD'sinin arayüzünde görmüştüm. Arayüz ilgimi çekmişti çünkü bir tarayıcı gibi
içinde HTML olduğunu hissetmiş fakat ortada bir tarayıcı görmemenin de
şaşkınlığını yaşamıştım. Sonra biraz CD'yi karıştırınca HTA'larla tanıştım. HTA
aslında HTML vs bir scripting dili ile yazılabilir uygulamalar şeklinde
tanımlanabilir. Bu uygulamalar "Microsoft HTML Applicatio Host" adında özel bir
uygulama tarafından Windows içerisinde host edilir. Arka planda Internet
Explorer kullanılır fakat kullanıcılar bunu görmez. HTA uzantılı bir dosya
rahatlıkla Notepad ile açılabilen birer HTML dosyasıdır aslında.
[HTA]
<HTML>
<head>
<link href="img/styles.css" type="text/css" rel="stylesheet" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<TITLE>
Internet Explorer 8 -DVD
</TITLE>
<HTA:APPLICATION
APPLICATIONNAME="IE8DVD"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
SINGLEINSTANCE="yes"
ICON="setup.ico"
SCROLL="no" />
</HEAD>
<body style="margin:0px;">
<script for="window" event="onload">
window.resizeTo(820,640);
window.moveTo((screen.width - 820) / 2, (screen.height - 640) / 2);
</script>
</body>
</html>
Yukarıda gördüğünüz kod basit bir HTA dosyasının içeriği. Aslında içerisinde
pek birşey yok. İlk anlamamız gereken şey aslında bir HTML ile çalışıyor
olduğumuz. Tabi biz arayüzü oluşturmak için HTML değil Silverlight kullanacağız.
Önemli olan ilk şey tabi ki dokümanın TITLE kısmını ayarlamak çünkü bu
uygulamanızın açılan penceresinin başlığı olacak. Aşağıda gördükleriniz ise
uygulama parametreleri.
[HTA]
<HTA:APPLICATION
APPLICATIONNAME="IE8DVD"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
SINGLEINSTANCE="yes"
ICON="setup.ico"
SCROLL="no" />
Uygulamanın açılacağı pencerede pencereyi büyütme, küçültme vs gibi düğmeleri
isteyip istemediğinizi belirtebilir hatta uygulamanın tek oturumunun olmasını da
yukarıdaki parametreler ile sağlayabilirsiniz. Uygulama ikonunu da ayarladıktan
sonra önemli noktalardan biri Scroll özelliği NO
şeklinde set etmek. Malum biz bu HTML içerisinde arayüz olarak Silverlight
koyacağımız için zaten gerekli scroll işlemlerini de SL içerisinde
halledebiliriz.
[HTA]
<script for="window" event="onload">
window.resizeTo(820,640);
window.moveTo((screen.width - 820) / 2, (screen.height - 640) / 2);
</script>
Yukarda basit bir JavaScript kodu görüyorsunuz. Bu kod uygulamanızın
penceresinin boyutunu ayarlayacağı gibi pencerenin de ekranın tam ortasında
gözükmesini sağlayacaktır. HTA'lar içerisinde hem JavaScript hem VBScript
kullanabilirsiniz. Her script ait olduğu nesneye for özelliği
ve ait olduğu nesnenin hangi event'ını dinleyeceğine de event
parametresi ile bağlanır.
Bu noktadan sonra tabi ki sizin ilk olarak Silverlight uygulamanızı
hazırlamanız gerek. Arayüz olarak kullanılacak Silverlight uygulaması
hazırlandıktan sonra bu HTA içerisine uygun şekilde yerleştirilebilmesi çok
önemli.
[HTA]
<HTML>
<head>
<link href="img/styles.css"
type="text/css"
rel="stylesheet"
/>
<meta
http-equiv="Content-Type"
content="text/html; charset=utf-8">
<TITLE>
Internet Explorer 8 -DVD
</TITLE>
<HTA:APPLICATION
APPLICATIONNAME="IE8DVD"
MAXIMIZEBUTTON="no"
MINIMIZEBUTTON="no"
SINGLEINSTANCE="yes"
ICON="setup.ico"
SCROLL="no"
/>
</HEAD>
<body
style="margin:0px;">
<div id="silverlightControlHost">
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/Interface.xap"/>
<param name="background" value="white" />
<param name="minRuntimeVersion" value="2.0.31005.0" />
<param name="autoUpgrade" value="true" />
<img style="cursor:pointer;" ID="SLInstall" border="0" src="images/install.jpg" />
</object>
</div>
<script for="window"
event="onload">
window.resizeTo(820,640);
window.moveTo((screen.width - 820) / 2, (screen.height - 640) / 2);
</script>
<SCRIPT FOR="SLInstall" EVENT="onclick" LANGUAGE="VBScript">
Dim objShell
Dim lngReturn
on error resume next
set objShell = CreateObject( "WScript.Shell" )
lngReturn = objShell.Run ("Silverlight.2.0.exe", 4, 1)
set objShell = Nothing
document.execCommand("Refresh")
</SCRIPT>
</body>
</html>
İşte esas noktaya geldik. Yukarı gördüğünüz OBJET tagları klasik bir SL
uygulamasının bir HTML sayfaya yerleştirildiği taglardan farklı değil. Bir tek
minik fark var o da OBJECT tagları içindeki HTML kodu! Hatırlarsanız tarayıcılar
eğer OBJECT taglarını render edemezse içlerindeki HTML'i gösteriyorlardı. Bu
gibi bir durumda Silverlight hedef makinede yüklü değilse bu demektir de
tarayıcı OBJECT taglarını render edemeyecek bir OBJECT içerisindeki HTML'i
kullanıcıya gösterecek.
[HTML]
<img style="cursor:pointer;" ID="SLInstall" border="0" src="images/install.jpg" />
Yukarıdaki şekilde güzel bir resim Silverlight yüklü değilken gösterilecek
resim olarak seçilebilir. Tabi bu resmin tasarımında kullanıcıya uygun mesajı
bir metin olarak göstermeniz şart. Diğer yandan bu resim nesnesinin fare ile
üzerine geldindiğinde el işareti gösterilmesi için uygun CSS'in kullanılması da
gerekiyor. Son olarak bu IMG'ye bir de ID veriyoruz çünkü bu resme tıklandığında
Silverlight Runtime yüklemesini başlatmalıyız!
[VBScript]
<SCRIPT FOR="SLInstall" EVENT="onclick" LANGUAGE="VBScript">
Dim objShell
Dim lngReturn
on error resume next
set objShell = CreateObject( "WScript.Shell" )
lngReturn = objShell.Run ("Silverlight.2.0.exe", 4, 1)
set objShell = Nothing
document.execCommand("Refresh")
</SCRIPT>
Yukarıda bir VBScript kodu görüyorsunuz. Silverlight Runtime
yüklemesine ait EXE dosyasının HTA ile aynı
klasöre koyduktan sonra uygun zamanda yüklemeyi başlatmak şart. Bunun için bir
Shell nesnesi yaratarak yüklemeyi başlatabiliyoruz. Yükleme
bitince de sayfaya Refresh atıyoruz böylece kullanıcı yüklemeyi
yaptıktan sonra ekranı kapatıp açmadan hemen arayüzü görebiliyor. Bu scriptin
FOR ve EVENT özelliklerine bakarsanız bizim
bir önceki adımda yarattığımız IMG nesnesinin onclick
durumunda çalışacağını görebilirsiniz.
Diskten birşey çalıştırmak istersek?
Biliyorsunuz Silverlight'ın çalıştığı makinedeki diske erişimi yok. Bunun
nedeni Silverlight'ın çalıştığı yer olan tarayıcı içerisindeki alandan yani bir
web sitesinden de hedef makinedeki diske ulaşamıyor olmamız. HTA'lar bu konuda
biraz farklılar. HTA'larda rahatlıkla diske erişebilirsiniz. Aslında bir önceki
örnekte biz bu işi zaten yapmadık mı? HTA içerisinden gidip Silverlight
Runtime'ı yüklemek demek harici bir EXE'yi çalıştırmak demek değil mi? Aynen
öyle. Peki biz bunu Silverlight içerisinden nasıl yapabiliriz?
Silverlight içerisinde çıkıp VBScript'e ulaşıp, parametre göndererek VBScript
ile de diske erişebiliriz.
[VBScript]
<SCRIPT LANGUAGE="VBScript">
sub Getir(byval address)
Dim objShell
Dim lngReturn
on error resume next
set objShell = CreateObject( "WScript.Shell" )
lngReturn = objShell.Run (address, 4, 1)
set objShell = Nothing
end sub
</SCRIPT>
Yukarıda gördüğünüz VBScript metodu tek bir parametre alarak Shell nesnesi
yaratıp parametreden gelen adresi diskte çalıştırmaya çalışıyor. Bu durumda biz
bu metodu Silverlight tarafından çağırıp uygun parametreyi verebilirsek işlem
tamamlanmış demektir.
[VB]
Private Sub btnSource_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSource.Click
System.Windows.Browser.HtmlPage.Window.Invoke("Getir", New String("samples/Hedehodo.exe"))
End Sub
İşte bu kadar basit. Silverlight'tan DOM'a çıkarak Getir adındaki metodumuzu
çalıştırıp bir de String parametre gönderiyoruz. Söz konusu String parametre
aslında çalıştırmak istediğimiz uygulamanın HTA dosyasının bulunduğu yere göre
relative Uri'sini içeriyor. Böylece bu parametre VBScript'e aktarılacak, oradan
da Shell üzerinden çalıştırılabilecek.
Süper değil mi?
Şimdi yapabileceklerinizi bir düşünün :) Silverlight uygulaması içerisinde
yapabildiğiniz herşey bir anda bir DVD arayüzüne dönüştürülebiliyor.
SaveFileDialog, OpenFileDialog, Socket bağlantılar!, Desktop moduna geçip
makineye anında yükleme yapabilmek! ve daha bir çok Silverlight özelliğini bir
anda kullanabilir hale geliyorsunuz! Bu gerçekten muhteşem!
Geçen yıl
bugünlerde sizlerle ASP.NET alanında MVP olmamın müjdesini paylaşmıştım. Bu
süreçte şöyle kabaca baktığımda son bir yılda 300'ü aşkın blogpost, 100'ü aşkın
teknik makale ile bildiklerimi paylaşmaya çalışırken seminerler ile de hesabıma göre 15.000 kişiye ulaşmışım. İtiraf etmek gerekirse "önümüzde yılda daha
fazlasını yapacağım" gibi bir iddiada bulunamam :) ama aynı tempo devam edecek
diyebilirim.
Silverlight MVP'si oldum!
Bu yazıyı yazmamın esas nedeni sanırım belli oldu :) 2009 yılında da MVP
ödülüne layık görüldüm. Bu sefer ödülü aldığım alan Silverlight oldu. Biraz
şanslı bir olarak dünyadaki ilk Silverlight MVP'lerindenim çünkü bu uzmanlık
alanı daha yeni açıldı :) Ortadoğu-Afrika bölgesinde ise en azından bu dönemde
aldığım duyumlara göre tek Silverlight MVP'si olmuşum. Bu durum özellikle
bölgede Türkiye'nin önderliği adına, kendi kendime mutlu olduğum bir detay oldu
diyebilirim.
Hepinize bu süreçte gösterdiğiniz destek için çok teşekkür ediyorum.
Yeni yılda hayatınızı kolaylaştırma yolunda iddialıyım :) Bu sefer de benim
işimi çok kolaylaştıran bir aracı sizlerle paylaşacağım.
Visual Studio içerisinde F5'e bastığımızda System Tray'de beliren "ASP.NET Development Server"'ı hatırlarsınız. Aslında adı "Cassini" olan bu server
işimizi epeyce kolaylaştırır ve bizim her sererinde IIS'te sitemizi veya
uygulamamızı ayarlamamızı gerektirmeden uygulamanın sanal bir sunucu ortamında
test edilmesini sağlar.
Peki hiç herhangi bir projenizi doğrudan çalıştırıp görmek istediğinizde
mecburen Visual Studio ile açıp F5'e bastığınız oldu mu? :) Veya mecburen IIS'te
web site ayarlamak zorunda kaldınız mı? sadece sitenizi çalıştırabilmek için?
İşte bu işkence aslında sürekli yaşadığımız bir süreç ve çok kolay bir çözümü
var. Biz de Visual Studio gibi gidip Cassini'yi kullanabiliriz.
Aslında Cassini bizim bilgisayarlarımızda WebDev.WebServer.exe
olarak yüklü bulunuyor. Tabi ki EXE'yi doğrudan alıp taşıyamazsınız, çok sayıda
bağlantılı DLL vs de söz konusu. Ama biz bu EXE'ye doğru parametreleri
gönderirsek aynı Visual Studio'nun kullandığı gibi herhangi bir klasördeki
dosyaları web sunucudaymış gibi çalıştırabiliyor. Bu EXE'nin nasıl
kullanıldığını merak edenleri veya birazdan sizlerle tanıştıracağım uygulamanın
nasıl yazıldığını merak edenleri İngilizce blogumdaki
bir yazıya davet edebilirim :)
 Sağ tıkla sunucudaaymış gibi çalıştır!
Gelelim sadede... Infragistics'te çalışan J. Ambrose Little tüm bunları yaparak uygulamayı da bir SETUP paketi şeklinde hazırlamış ve bununla da kalmamış ve bu sistemi işletim sisteminin context menü'süne bağlamış. Yani özetle; herhangi bir klasöre sağ tıklayıp "ASP.NET 2.0 Web Server Here" dediğizde Cassini açılıyor ve söz konusu klasör içerisindeki uygulama server üzerinden çalıştırılıyormuş gibi karşınıza çıkıyor. Aynı Visual Studio'da F5'e basmış gibi :)
Uygulamayı aşağıdaki linkten bilgisayarınıza indirip yükleyebilirsiniz.
Cassini Web Server Launcher - 02012009_1.msi (355 KB)
ASP.NET 2.0 dediğine bakmayın 3.5 SP1 ile herhangi bir sorunu yok.
Hepinize kolay gelsin...
Microsoft'un dünya çapındaki Imagine Cup yarışmasının bu seneki ayağının
finali Mısır'da yapılacak. Tabi onun öncesinde Türkiye ayağı ile yarışmacıların
Türkiye birinciliğini almaları gerekiyor :)
Imagine Cup 2009 için bu yıl öğrenciler; dünyanın en zorlu sorunlarına, teknoloji ile çözüm bulabilecekleri bir dünya düşlemeye davet ediliyor. Bazılarımız teknolojiyi dünyanın her yerindeki insanlara eğitim şansı kazandırmak için kullanacaktır, ya da sağlık alanında yepyeni ufuklar açmak için. Bazılarımız ise cinsiyetler arası fırsat eşitsizliğini çözmek isteyecektir. Imagine Cup 2009 teması için örnek gösterilen Birleşmiş Milletler Milenyum Hedeflerinin açıklandığı, geçtiğimiz yılların deneyimlerinin aktarıldığı ve teknik oturumların bulunduğu Imagine Cup 2009 Lansmanı
20 Aralık Cumartesi günü Microsoft Istanbul
ofisinde gerçekleştirilecek.
Aktiteye katılmak için
buradan kayıt olmanız gerekiyor.
Sabah saat 10.00'da başlayacak etkinliğin planına
buradan ulaşabilirsiniz. En son teknik oturum benim ;) Konumuz: Expression
Studio.
Mart ayında sizleri Silverlight T-Shirt'üm ve sonrasında da
Tish-O ile tanıştırmıştım. Böylece sizler de isterseniz SilverMan T-Shirt'ünden
sipariş verebilecektiniz :) Eh birileri siparişleri vermiş :) FaceBook'taki Fan
Club'ımın da kurucuları olan Ahmet Enes Dabanlıoğlu ve
Fatih Gençaslan heyecanları ile gerçekten beni etkilediler. Arkadaşlar
bu heyecanı satır satır kodlara dökmeniz dileği ile ;)
 The Silver Team :)
Taaaa 12 Ocak 2008 tarihinde :)
CETURK organizasyonunda
Microsoft binasında bir seminer günü düzenlemiştik ve o günde ben de Silverlight
1.0 ve WPF anlatmıştım. Aktivitenin videoları sonunda :) CETURK sitesinde
yayınlandı. Videolara aşağıdaki adresten ulaşabilirsiniz;
http://www.ceturk.com/Dersizle.asp?id=482
Hepinize kolay gelsin.
Bugün İzmir'de hosting sağlayıcılar ile bir bir eğitimimiz oldu. Benim için
çok güzel bir fırsattı :) çünkü zaten hali hazırda Türkiye'deki hosting
sağlayıcılar ile ilgili dertliyim. Şirket tarafında müşterilerimize sunduğumuz
içerik yönetim sistemlerini müşterilerimiz hosting sağlayıcılardan aldıkları
alanlara koyduklarına bir çok sorun ile karşılaşıyoruz. Bu sorunların
detaylarına inerek eğitim boyunca ASP.NET hosting yaparken nelere dikkat
edilmesi gerektiğine değindim.
 Microsoft Hosting Çözümleri Eğitimi, İzmir
Seminerlerde özellikle bana "ASP.NET 3.5 destekli hosting nasıl buluruz?"
gibi sorular geliyor. Bu soruları ve arayışı doğrudan hosting firmalarındaki
yetkililere iletme şansım oldu. İlginç bir şekilde sunucularında .NET Framework
3.5 kurulu olduğunu fakat sitelerinde hala 2.0 yazdığını söylediler :) Tabi en
kısa zamanda bu hatayı düzeltecekler. Hatta birkaç gün içerisinde SP1 yüklü
hostinglerimiz bile olacak Türkiye'de.
Bir diğer konu da tabi ki Silverlight'dı :) Silverlight'ın IIS tarafındaki
Mime Type ayarlarından ve detaylarından bahsettik.
Eğitimde kullandığım sunumu aşağıdan indirebilirsiniz.
Hosting Çözümleri Eğitimi Sunumu - 21082008_1.pptx (206,66 KB)
Bundan yaklaşık bir hafta kadar önce Adobe sponsorluğundaki
RiaTalks etkinliğinde Silverlight anlatmıştım.
Sizleri hem aktivite öncesi hem de sonrası blogdan bilgilendirmiştim. İşte o
aktivitede yine ufak bir video çalışmamız oldu. Video konusundaki yardımlarından
dolayı Murat Duman'a teşekkür ediyorum. İyi seyirler...
Bundan yaklaşık 6 ay önceydi sanırım
GGK
organizasyonunda bir Silverlight seminerimiz olmuştu. Bu seminerin video kaydı
alınıp internete konmuş olsa da ben blogdan paylaşmayı unutmuşum :) Sağ olsun
sevgili Recep Selli durumu hatırlamamı sağladı. Silverlight
1.0 gibi artık eski diyebileceğim bir konu olsa da buyurun arkadaşlar 3 saatlik
Silverlight 1.0 semineri karşınızda.
Bugün riatalks.com aktivitesindeydim. RIA (Rich Internet Application) konusu
çerçevesinde gerçekleştirilen aktivite serisinde benim de ufak bir Silverlight
konuşmam oldu. Çok fazla teknik içeriği olmayan zevkli bir aktiviteydi. Hatta
yarın da aktivite devam ediyor olacak.
 RIATALKS aktivitesinden bir kare...
Özellikle RIA konusunda bir vizyon edinmek isteyenler Bahçeşehir
Üniversitesi'nde düzenlenen aktiviteye katılmalarını tavsiye ederim.
Silverlight uygulamaları içerisinden "Clipboard"a ulaşmak
istediğinizde maalesef hazır bir altyapı ile en azından şimdilik
Silverlight 2.0 Beta 2 içerisinde karşılaşmıyoruz. Aynı şekilde
Silverlight 1.0 içerisinde de bu sorun için bir çözüm yok. Fakat özellikle
Silverlight 1.0 tarafında zaten JavaScript'in ana programlama yapısı olduğunu
düşünürsek "Acaba tarayıcı içerisinde JavaScript ile bir çözüm oluşturabilir
miyiz?" sorusu akla geliyor. Bu sorunun cevabı en azından Internet Explorer
için "Evet". FireFox varsayılan ayarları ile bu gibi işlemlere JavaScript
tarafında olanak tanımıyor.
Silverlight 1.0 ile Clipboard kullanımı
Yeni bir Silverlight 1.0 projesi yaratarak içerisine bir TextBlock
ve Rectangle yerleştirelim. Yapacağım işlem TextBlock
içerisinde yazılı metni Rectangle'a basıldığında ClipBoard'a taşımak olacak.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480"
Background="White"
x:Name="Page">
<TextBlock Width="274.242" Height="43.939" Canvas.Left="31.818" Canvas.Top="27.273" Text="Kopyalanacak Metin" TextWrapping="Wrap" x:Name="Etiket"/>
<Rectangle
MouseLeftButtonDown="Kopyala" Width="122.727" Height="43.939" Fill="#FFFF0000" Stroke="#FF000000" Canvas.Left="31.818" Canvas.Top="92.425" RadiusY="16.167" RadiusX="16.167" x:Name="Dugme"/>
</Canvas>
Yukarıdaki kod uygulamamızın görsel arayüzünü oluşturuyor. "Dugme"
adındaki Rectangle nesnemizin MouseLeftButtonDown durumunda
çalıştırılacak olan kodu birazdan yazacağız.
function Kopyala(sender)
{
window.clipboardData.setData("text", sender.findName("Etiket").Text);
}
Kodumuz içerisinde kullandığımız clipboardData sınıfı ile ilgili detaylara
MSDN üzerinden ulaşabilirsiniz. setData metodu toplamda iki parametre
alıyor; bunlardan ilki ClipBoard'a kopyalanacak olan verinin tipi, ikincisi ise
kopyalanacak olan içeriğin ta kendisi. Aynı şekilde isterseniz ClipBoard'dan
veri almak için getData metodunu da kullanabilirsiniz.
function Getir(sender)
{
sender.findName("Etiket").Text = window.clipboardData.getData("text");
}
getData metodu sadece ClipBoard'dan alacağı verinin tipini
parametre olarak alarak geriye doğrudan elde ettiği veriyi döndürüyor.
Peki ya Silverlight 2.0 tarafında neler yapacağız?
Aslında çok farklı bir işlem yapmayacağız. Silverlight 2.0 Beta 2 tarafında
da şimdilik JavaScript'in nimetlerinden faydalanmak zorundayız. O nedenle
istemci tarafındaki VB veya C# kodumuz ile sayfanın JavaScript tarafındaki
özelliklerine ulaşıp yine JavaScript tarafındaki metodlarını çalıştıracağız.
İlk olarak Silverlight 2.0 Beta 2 uygulamamızın arayüzünü aşağıdaki şekilde
düzenleyelim.
<UserControl x:Class="SilverlightApplication14.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White">
<TextBox Height="40" HorizontalAlignment="Left" Margin="16,8,0,0" VerticalAlignment="Top" Width="120" Text="Herhangi bir Metin" TextWrapping="Wrap" x:Name="txtMetinKutusu"/>
<Button Height="24" HorizontalAlignment="Left" Margin="16,72,0,0" VerticalAlignment="Top" Width="88" Content="Kopyala"
x:Name="btnKopyala"/>
<Button Height="24" HorizontalAlignment="Left" Margin="16,112,0,0" VerticalAlignment="Top" Width="88" Content="Yapıştır"
x:Name="btnYapistir"/>
</Grid>
</UserControl>
Bir TextBox ve iki Button'dan oluşan uygulamamızın ilk olarak kopyalama
işlemini yapacak olan kodunu yazalım.
[VB]
Private Sub btnKopyala_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnKopyala.Click
Dim Clipboard As Browser.ScriptObject = Browser.HtmlPage.Window.GetProperty("clipboardData")
Clipboard.Invoke("setData", "text", txtMetinKutusu.Text)
End Sub
[C#]
void btnKopyala_Click(object sender, RoutedEventArgs e)
{
System.Windows.Browser.ScriptObject Clipboard = (System.Windows.Browser.ScriptObject)System.Windows.Browser.HtmlPage.Window.GetProperty("clipboardData");
Clipboard.Invoke("setData", "text", txtMetinKutusu.Text).ToString();
}
Kodumuz içerisinde ilk olarak tarayıcının clipboardData
sınıfını yakalamamız gerekiyor. Bunun için içerisinde olduğumuz tarayıcının
(Browser) yine mevcut HTML sayfasının (HtmlPage) ait olduğu pencereyi (Window)
yakalayıp onun üzerinden GetProperty ile
clipboardData'yı alarak ScriptObject tipinde
yarattığımız Clipboard değişkenimize aktarıyoruz. Sonrasında doğrudan
değişkenimiz üzerinden Invoke diyerek aynı Reflection
yapar gibi setData metodunu çalıştırıyoruz. Normal şartlarda
JavaScript tarafına vereceğimiz parametreleri de yine Invoke
metoduna aktarıyoruz. Böylece kopyalama işlemini tamamlamış olduk. Aynı şekilde
ClipBoard'dan veri almayı da hemen getData ile yapabiliriz.
[VB]
Private Sub btnYapistir_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnYapistir.Click
Dim Clipboard As Browser.ScriptObject = Browser.HtmlPage.Window.GetProperty("clipboardData")
txtMetinKutusu.Text = Clipboard.Invoke("getData", "text")
End Sub
[C#]
void btnYapistir_Click(object sender, RoutedEventArgs e)
{
System.Windows.Browser.ScriptObject Clipboard = (System.Windows.Browser.ScriptObject)System.Windows.Browser.HtmlPage.Window.GetProperty("clipboardData");
txtMetinKutusu.Text = Clipboard.Invoke("getData", "text").ToString();
}
Clipboard'dan veri alırken de aynı şekilde clipboardData
nesnemizi yakaladıktan sonra bu sefer getData metodunu
çalıştırıyoruz ve geriye dönen değeri de örneğimizde TextBox
içerisine yazdırıyoruz.
C# kullananların haricen aşağıdaki şekilde uygulama başlangıcında Event-Handlar
bağlantılarını yapmaları gerekecektir. VB kodlarındaki Handles keyword'ü ile bu
işlem satır içinde yapılabildiği için ek olarak yazmak gerekmiyor.
[C#]
public Page()
{
InitializeComponent();
btnKopyala.Click += new RoutedEventHandler(btnKopyala_Click);
btnYapistir.Click += new RoutedEventHandler(btnYapistir_Click);
}
Böylece hem Silverlight 1.0 hem 2.0 içerisinde Clipboard'dan veri alarak veri
aktarımı yapabildik. Tabi tüm bu işlemlerin sadece Internet Explorer içerisine
olması üzücü. Diğer tarayıcılar için de geçerli olacak şekilde umarız ileride
Silverlight Runtime içerisine standart işlevsellikler eklenir.
Hepinize kolay gelsin.
Son yazgelistir.com Editör toplantımızda aldığımız kararlardan biri de yazgelistir.com ana sayfasında gözüken "Son Makaleler" kısmını biraz daha kullanışlı hale getirmekti.
Bu çerçevede söz konusu bölüm için bir Silverlight uygulaması hazırlamaya karar
verdik. Uygulamanın tasarımını sevgili
Erbuğ Kaya yaptı.
Animasyonlar ve programlama bana ait :) Süreç boyunca sunucu altyapısı ve
RSS'lerin ASP.NET ile üretimi konusunda desteği için ek olarak sevgili
Tamer Öz ve
Işıl Orhanel'e de
buradan teşekkürlerimi iletiyorum.
Bakalım beğenecek misiniz?
www.yazgelistir.com
Ticari bir uygulama olmadığı için tabi ki sizlerle sitedeki projenin kaynak
kodlarını da paylaşacağım. Son haline baktığımızda herhangi bir RSS'i JavaScript
ve AJAX ile okuyarak Silverlight ile animasyonlar eşliğinde gösterebilen bir
Silverlight uygulamasından bahsediyoruz. Yükleme süresince "Yükleniyor"
animasyonunu da unutmadım :)
yazgelistir.com ana sayfadaki Silverlight kaynak kodları - 21062008_1.rar (19,51 KB)
Hepinize kolay gelsin....
FireFox 3 yarına downloada sunuluyor. Kişisel olarak FireFox kullanmamın iki nedeni var; birincisi güzel
eklentileri var, ikincisi sırayla açılmasını istediğim 20 üzerinde site varsa ve
bunları tablarda açıp bir 3 dakika sonra makineme gelip tek tek inceleyeceksem :)
FireFox kullanıyorum. Bunların haricinde pek FireFox açtığımı söylemem. Benim
için yazılımların açılma süreleri çok önemlidir, IE şu an benim makinemde en
hızlı açılan tarayıcı. (Makinemde Safari, FireFox yüklü)
Her neyse, FireFox 3 ile beraber Silverlight 1.0 uygulamaları maalesef
açılmıyor. Aslında olay bu kadarla kalmıyor, örneğin benim kullanmakta
olduğum neredeyse tüm eklentiler de FireFox 3 ile çalışmıyor. Bu arada güzel
bir haber aldım, Silverlight 2.0 Beta 2 FireFox 3 uyumluymuş.
Aslında uyumluluktan öte projelerde değişken tek şey Silverlight.js dosyası.
Eski uygulamaları nasıl upgrade ederiz?
Çok basit,
Silverlight 2.0 Beta 2 SDK ile beraber gelen
Silverlight.js dosyasını Silverlight 1.0 projelerinizde de
kullanabilirsiniz. Böylece sorun çözülmüş olacaktır. Unutmayın projenizi
Silverlight 2.0'a geçirmiyorsunuz sadece Silverlight.js dosyasını
değiştiriyorsunuz.
Hepinize kolay gelsin.
Yaklaşık 2 saat kadar önce
last.fm
üyesi oldum :) Siteyi çok duymuştum ama ilgilenecek fırsat olmamıştı. Gerçekten
çok başarılı bir altyapısı var. Siteye üye olduktan sonra bilgisayarınıza ufak
bir program yüklüyorsunuz ve ister Windows Media Player ile ister Winamp ile
çaldığınız tüm şarkılar otomatik olarak sitede yerini alıyor. Tabi bu veri
yığınından yola çıkarak site bir sürü ek işlevsellik sunuyor. Sizinle aynı
şarkıları dinleyenlerden tutun en çok dinlediğiniz şarkıların listelerini
otomatik olarak arkadaşlarınızla paylaşmaya kadar bir sürü seçenek mevcut.
Tabi siteye üye olunca hemen dinlediğim şarkıları blog okuyucularım ile de
paylaşmaya karar verdim ve daha önce sizlerle kaynak kodunu paylaştığım
Twitter Silverlight Widget'a el atarak Last.Fm uyumlu hale getirdim. Yeni
uygulamayı hazırlarkenki en büyük sorun Last.Fm'in Cross-Domain'e açık bir JSON
verisi sağlamaması olsu. Bu nedenle
ASP.NET ile sunucu taraflı proxy hazırlamam gerekti. Proxy Last.FM üzerinden
XML veriyi alarak Silverlight tarafına JSON formatında aktarıyor. Local proxy
kullanıldığı için Widget'ın veriyi yüklemesi normale kıyasla daha uzun sürüyor,
o nedenle bir de "Loading" animasyonu ekledim.
Artık dinlediğim şarkıları blogun yan barından izleyebilirsiniz :) Tabi daha
da önemlisi hazırladığım bu uygulamayı kaynak kodları ile aşağıdaki linkten
indirebilirsiniz ;)
Last.FM Silverlight Widget Kaynak Kodları - 13062008_1.rar (9,29 KB)
Hepinize iyi eğlenceler ;)
Bugün Edirne M.P. Anadolu Ticaret Meslek ve Ticaret Meslek
Lisesi'nin organizasyonunu üstlendiği Edirne'deki meslek liseleri'nin
yer aldığı bir seminer serisindeydim. Semineri Trakya Birlik Genel
Müdürlüğü Konferans Salonu'nda yaptık. Salon şu ana kadar gördüğüm en
ilginç ve güzel salonlardan biriydi. Balkonuyla beraber iki katlı seminer
salonunda alt kattaki ve üst kattaki dinleyiciler için ayrı projeksiyon
sistemlerinin bulunması dinleyici için çok ergonomik bir ortam sağlıyor.
 Edirne'ye gidip Selimiye Cami fotoğrafı çekmemek olmaz :)
Sabah 09.00 gibi seminerlere başladığımız için bir gün önceden Edirne'ye
gitmek durumunda kaldım. Dün akşam 20.00 gibi Edirne'deydim, Meriç kenarında bir
yemek yeme şansına sahip olmak muhteşemdi. Aslında otobüsle iki buçuk saat gibi
kısa bir sürede gidilebilen Edirne'yi (kendi adıma konuşayım) sanki biraz
farkında değiliz veya unutmuşuz gibime geldi. Rahatlıkla günübirlik gidip
gezilebilecek bir şehir.
 Selimiye Kubbesi İç Motifler
09.00'da başladıktan sonra öğleden sonra 18.00'a kadar WPF,
Silverlight ,AJAX ve LINQ konularına değindik. Bu benim ikinci Meslek
Lisesi deneyimim oldu. Lise çağındaki gençlere hitap edebilmek adına daha çok
çalışmam gerektiğini açıkça itiraf edebilirim :) Yine de aldığım tepkilere göre
faydalı bir gün geçirdik, parıldayan genç gözler gördüm.
 Edirne, MP (Anadolu) Ticaret Meslek Lisesi, WPF, Silverlight, AJAX, LINQ Seminerleri
Aktivite boyunca Edirne TV :) de oradaydı. Hatta sitelerinde de
aktiviteyi haber yyapmışlar. Özellikle sitedeki fotoğrafta biraz çok agresif
çıkmışım :) Zaten herkes sahnede rahat durmadığım için fotoğraf çekememekten
şikayetçi :)
Organizasyondaki emeklerinden dolayı sevgili Serdar Daloğlu'na
, Aziz Bayıroğlu ve Oğuzcan Şahin'e burada bin bir teşekkür ediyorum. Beni
muhteşem bir şekilde ağırlamanın yanı sıra organizasyondaki her tür detayı çok
başarılı bir şekilde yürüttüler.
Haziran'ın bu ilk gününde yazı karşılarken size yeni bir sürprizim var :)
T-Shirt ve kravatın ardında bir sürü mail aldım. T-Shirt'ü
Tish-O'ya paslayarak üretim sorununu halletmiş olduk. Fakat kravat konusunda
herhangi bir çözüm maalesef söz konusu değil. Diğer yandan aslında çok daha
kolay üretebileceğimiz bir şey var :) Özellikle önümüzde yazın da geldiğini
düşünürsek bir Silverlight şapkası süper olur diye düşündüm.
 Silverlight Şapka :) ve tatil sevdası!
Tasarım anlamında çok bir emek yok ortada :) Rahatlıkla sizin de
yapabileceğiniz bir uygulama. Silverlight logosunu aşağıdaki linkten
indiriyorsunuz ve doğrudan en yakın "dijital baskı merkezi"ne doğru ufak bir
yolculuk yapıyorsunuz. Neredeyse hepsi şapka üzerine baskı alabiliyor. Şapkanın
yıkanma durumu da t-shirt'e kıyasla daha nadir olduğu için herhangi bir baskının
pek sorunu olmayacaktır.
Silverlight Logo - 01062008_2.jpg (99,43 KB)
İlk şapkalıya hediye var :)
Hadi bakalım ilk önce kimi göreceğim etrafta bu şapka ile :) Bu şapkayı
takmış olarak gördüğüm ilk arkadaşı buradan sizlere de fotoğrafı ile duyurmanın
yanı sıra söz konusu arkadaş benden bir de güzel hediye alacak :) Sürpriz!
İyi şanslar...
Bugün ufak bir maceraya atılarak sanal makineye bir Ubuntu
kopyası yükledim :) Yanlış okumadınız bir Linux kopyasından bahsediyorum.
Aslında bu ilk değil, bundan önce belki yüzlerde defa Linux kurulumları yaptım
veya inceledim. Ama bu sefer amacım biraz farklıydı.
Silverlight'ın Linux üzerinde çalışacak olan sürümünün adının
Moonlight
olduğundan daha önce bahsetmiştim. Söz konusu proje Novell sponsorluğunda
ilerliyor ve bugünlerde hiç de yadsınamayacak bir seviyeye geldi. Artık
Moonlight ile Silverlight 1.0 projeleri rahatlıkla Linux üzerinde
çalıştırılabilir. Ufak bir sorun var :) maalesef daha video ve audio desteği
yok. Yani aslında Silverlight 1.0'ın en kuvvetli olduğu nokta eksik. Umarım
zamanla video ve audio desteği de Linux platformuna taşınacaktır. Diğer yandan
Silverlight 2.0 desteği de
Mono-Project
sayesinde hızlıca karşımıza çıkıyor olacak. Mono-Project sayesinde zaten uzun
süredir .NET uygulamaları Linux üzerinde bazı eksiklerle olsa da
çalıştırılabiliyordu. Bu altyapının Silverlight tarafına taşınması zor
olmayacaktır.
Ben Linux için olan Silverlight Plug-In'i ancak FireFox 3
üzerine kurabildim. Fakat malum FireFox 3 daha Beta aşamasında olduğu için
ekstra sorunlar da çıkabiliyor.
 İlk adımda yüklemeyi bilgisayarımıza indirelim.
Moonlight'ın http://www.go-mono.com/moonlight/
adresinden bilgisayarınıza uygun yüklemesini seçtikten sonra karşınıza
yukarıdaki gibi FireFox içerisinde bir uyarı mesajı geliyor. Onaylayarak
ilerliyoruz ve yükleme paketi bilgisayarımıza iniyor.
 Yüklemeyi başlatalım.
İnternette yükleme paketi bilgisayara indikten sonra pakete güvendiğimizi de
Linux'e belirtirsek bir sonraki adımda hemen yükleme gerçekleşecektir.
 Linux üzerinde Silverlight iş başında.
Yükleme tamamlandığında artık Silverlight ile hazırlanmış web sitelerini
rahatlıkla Linux üzerinde de kullanabiliyoruz. Umarım Novell'in istemci
tarafında Linux'ten desteğini çekmiş olması Moonlight'ın geleceğini etkilemez.
Super SilverMan T-Shirt tasarımımdan sonra tekstil sektörüne gireceğime dair
dedikoduların yanı sıra :) ciddi tavsiyeler bile aldım. T-Shirt gerçekten çok
başarılı bir ürün oldu :) diğer yandan maalesef her ortamda T-Shirt ile gezmek
mümkün olmuyor. "Gömlek bastıralım?" gibi bir fikrin biraz daha ötesine
giderek "kravat" konseptini uygun gördüm. Tasarım çalışmalarını
da tamamladıktan sonra uygun bir şekilde kravat üretimine geçtik :) (Dalga
geçmiyorum).
 Dünyada Tek : Silverlight Kravat
Kravatı bugüne kadar birkaç aktivitede kullandım ve deneme sürüşleri
sonrasında herhangi bir bug'ı olmadığını söyleyebilirim. :) Tasarım yine bana
ait ;) Maalesef şimdilik toplu üretim gibi bir şansımız yok, dehşet pahalıya mal
oluyor (tamamen dikiş). Diğer yandan tüm dünyada sadece bende böyle bir kravatın
bulunuyor olması de ayrı bir duygu :)
Peki ben bu yazıyı neden yazdım? :) "Düşmanlar çatlasın" diye değil
tabi ki :P Silverlight heyecanımı blog okuyucularımla paylaşmaktı amacım. Umarım
gün gelir Silverlight aktivitelerinde T-Shirt'ler, kravatlar kepçeyle dağıtılır
:)
"Daha çok Silverlight'lı günler dileği ile..."
Özellikle beni microbloğum
twitter.com
üzerinden takip edenlerin farkında olacağı üzere hafta sonunu Ankara'da
geçirdim. Cumartesi gece yarısı yola çıkarak sabahına Ankara'ya vardım ve sabah
10.00 gibi EMO (Elektrik Mühendisleri Odası) Ankara şubesinde eğitim serimize
başladık. WPF, AJAX, Silverlight ve LINQ konularına değindiğimiz eğitimi Pazar
akşamı 18.00'da bitirdik.
 EMO Eğitim Serisi başlangıcından bir kare...
Eğitime katılan arkadaşlara özellikle Silverlight örneğindeki kodları
blogumdan paylaşacağım konusunda söz vermiştim. Aşağıdan gerekli dosyaları
bilgisayarınıza indirebilirsiniz.
Örnek Kodlar - 25052008_2.rar (8,57 KB)
Eğitime katılan ve kocaman bir hafta sonu boyunca yeni teknolojiye olan
ilgilerini ve konsantrasyonlarını en yüksek seviyede tutan tüm arkadaşlara çok
teşekkür ediyorum (Özellikle ikinci gün sınıfa pasta alan kamera fobili
arkadaşımıza ek teşekkürler :))
INETA ve EMO işbirliğinizde düzenlediğimiz bu eğitime katkısından dolayı ODTÜ
Bilgisayar Mühendisliği Araştırma Görevlisi Serdar Çiftçi'ye,
eğitimlere laboratuar ortamı sağlamakla beraber
gösterdikleri sıcak misafirperverlik için de tüm EMO ekibine teşekkürler.
Özellikle "developer" tabanlı olanlar için hazırlanan bir
uygulamanın görsel arayüzünü süslemek hem bir "çin işkencesi" oluyor hem de
ortaya zaten güzel bir ürün de çıkmıyor. Bu gibi durumlarda eğer projelerinizde
bir tasarımcı ile çalışma şansınız da yoksa en azından internetteki hazır renk
şemalarından faydalanabilir, birbiri ile uyumlu renkler üreten web sitelerinden
faydalanabilirsiniz.
Veya daha da pratik bir yol var, bir yerlerde beğendiğiniz renkleri "ödünç"
alabilirsiniz :) Peki nerden? Hemen önünüzde Windows Vista duruyor, tasarımı da
hiç fena sayılmaz :)
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="375.082"
Background="White"
x:Name="Page">
<Rectangle Width="572.131" Height="78.885" Canvas.Left="31.148" Canvas.Top="8" Stroke="#FF000000">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0.5,1" EndPoint="0.5,0">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FF000000" Offset="0"/>
<GradientStop Color="#FF9AC6CF" Offset="0.0494537"/>
<GradientStop Color="#FF54A1AA" Offset="0.0714264"/>
<GradientStop Color="#FF146478" Offset="0.5"/>
<GradientStop Color="#FF408C9A" Offset="0.505493"/>
<GradientStop Color="#FF87B6C0" Offset="0.928574"/>
<GradientStop Color="#FFBCCDD7" Offset="0.950546"/>
<GradientStop Color="#FFAEBFCA" Offset="0.983521"/>
<GradientStop Color="#FFAEBFCA" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width="572.131" Height="78.885" Canvas.Left="31.148" Canvas.Top="99.784" Stroke="#FF000000">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0.5,1" EndPoint="0.5,0">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FF000104" Offset="0"/>
<GradientStop Color="#FF02070B" Offset="0.494507"/>
<GradientStop Color="#FF33373D" Offset="0.494507"/>
<GradientStop Color="#FF757A7C" Offset="0.917587"/>
<GradientStop Color="#FFA0A1A3" Offset="0.956039"/>
<GradientStop Color="#FF48494A" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width="572.131" Height="78.885" Canvas.Left="31.148" Canvas.Top="189.929" Stroke="#FF000000">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0.5,1" EndPoint="0.5,0">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFD4D4D4" Offset="0"/>
<GradientStop Color="#FFF0F2F4" Offset="0.0659332"/>
<GradientStop Color="#FFF6F5F8" Offset="0.598907"/>
<GradientStop Color="#FFFFFFFF" Offset="0.609894"/>
<GradientStop Color="#FFFFFFFF" Offset="0.978027"/>
<GradientStop Color="#FFC7C7C7" Offset="0.994507"/>
<GradientStop Color="#FFC7C7C7" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<Rectangle Width="572.131" Height="78.885" Canvas.Left="31.148" Canvas.Top="281.713" Stroke="#FF000000">
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0.5,1" EndPoint="0.5,0">
<LinearGradientBrush.GradientStops>
<GradientStop Color="#FFDFE4F4" Offset="0"/>
<GradientStop Color="#FFB8BCC2" Offset="0.0439606"/>
<GradientStop Color="#FFE0E6F4" Offset="0.0769196"/>
<GradientStop Color="#FFD4DBE8" Offset="0.648346"/>
<GradientStop Color="#FFE8ECF4" Offset="0.714279"/>
<GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Canvas>
İşte size Vista'daki gradientların Silverlight veya WPF ile kullanılabilecek
XAML kodları. Yukarıdaki örnek Silverlight 1.0 uygulamasında dört farklı
gradientı gösterebilmek için dört adet dikdörtgen kullandım.
 Vista Gradientları
Hepinize kolay gelsin.
İstemci taraflı programlama sistemleri AJAX ile karşımıza çıkmıştı,
Silverlight ile beraber ise artık istemci taraflı programlama neredeyse
"hayatımız" oluyor. Bu durumda karşılaştığımız en büyük sorun "Cross-Domain-Request"
sınırlaması. Güvenlik nedenleriyle bir alan adından bir başka alan adına
bağlanarak veri talebinde bulunamıyoruz. Eğer karşıdaki alan adının ihtiva
ettiği siteye admin erişiminiz varsa tabi ki farklı teknikler kullanarak bu
sorunu çözebilirsiniz. Bu konuda Silverlight 2.0 ile beraber
clientaccesspolicy.xml
dosyası geliyor.
Peki ya karşı siteye admin erişimimiz yoksa?
İşte o zaman kendi sitemizde sunucu taraflı bir proxy kullanmamız şart.
ASP.NET ile sunucu tarafından istediğimiz siteye bağlanarak istediğimiz dosyası
alabiliriz. Bu durumda bir ASPX sayfası yapsak bizim yerimize gidip kendisine
hedef gösterdiğimiz adresten gerekli dosyayı alıp istemci tarafına, yani bize
iletse hoş olmaz mı?
Dim Talep As New Net.WebClient
Dim GelenVeri As Byte() = Talep.DownloadData(Request.QueryString("Dosya"))
Response.ContentType = Talep.ResponseHeaders("Content-type").ToString
Response.OutputStream.Write(GelenVeri, 0, GelenVeri.GetLength(0))
Response.OutputStream.Close()
Response.End()
Yukarıdaki kod içerisinde doğrudan bir WebClient yaratarak
farklı bir adresten veri indirme işlemi yapıyoruz. Kod içerisindeki en önemli
nokta indirmek istediğimiz hedef veri ile istemciye göndereceğimiz verinin
ContentType değerlerinin aynı olması gerektiği. Bunun için
Response.ContentType'ı WebClient üzerinden aldığımız
Content-Type header bilgisi ile eşleştiriyoruz. Böylece proxy'miz
gerektiğinde video veya resim dosyalarını da rahatlıkla indirerek bize
ulaştırabilir.
Performans?
Yukarıdaki örneğimiz çok basit bir yapıya sahip. Dosyayı sunucuya indirerek
doğrudan istemciye gönderiyor. Yüksek sayıda istek oluşan projelerde veya büyük
dosyalar indirecek olan uygulamalarında farklı performans senaryoları uygulamak
gerekecektir. Aslında baktığımızda bu yapının herhangi bir Proxy programlamaktan
pek farkı yok. Aklıma ilk aşamada gelen dikkat edilmesi gereken noktalar şöyle
oldu;
- Büyük dosya indirirken istemcinin hala bağlı olup olmadığını Response.IsClientConnected
ile kontrol etmek gerekir.
- Büyük dosya indirme işlemlerinde bufferlamak ve kısım kısım indirerek
istemciye göndermek daha mantıklı olabilir. Özellikle video dosyalarında.
- Kesinlikle bu dosyaya request yollayanın headerını kontrol etmek lazım.
Kötü niyetli biri bu proxy'yi sadece sunucunun bant genişliğini harcamak
için kullanabilir veya gereksiz yere sunucuyu yorabilir.
Hepinize kolay gelsin.
Uzun süredir "Yahu nedir ki bu twitter??" şeklinde düşünerek takip
ediyordum olan biteni. Bugün biraz zaman bulunca twitter.com üzerinden kendime
yeni bir hesap açmaya karar verdim. Hesabımı açmamla beraber cep telefonuma
twitter hesabımı güncelleyebileceğim uygulamaları da yüklemem bir an bile
sürmedi :) Peki neden?
Genelde seminerlerde ve farklı etkinliklerde karşılaştığım sorunlardan biri
de o etkinlikten insanların anında haberdar olamıyor olması. Hatta bazen "Biz
de oradaydık o gün! Tüh görüşemedik" veya "Bilsek gelirdik, yakındaydık
aslında" gibi yorumlar hep oluyor. İşte twitter bunun çözümü. Maksimum 140
karakterlik mesajlar ile twitter hesabınıza o an ne yaptığınızı yazıyorsunuz,
böylece arkadaşlarınız sizi takip edebiliyor. Facebook'tan alışkın olduğumuz "Status"ün
epeyce gelişmiş hali diyebiliriz. Hemen
twitter.com adresinden kendinize bir hesap edinebilirsiniz. Sonrasında da
takip etmek istediğiniz kişilerin site üzerinden seçerek hesabınıza
ekleyebiliyorsunuz.
Eğer sisteme cep telefonunuzu da tanıtırsanız, özel olarak seçmiş olduğunuz
kişilerin twitter hesaplarında bir değişiklik olduğunda size de bir sms geliyor.
Hatta doğrudan sms ile kendi hesabınızı da değiştirebiliyorsunuz. Ben şahsen
GPRS üzerinden çalışan harici bir uygulamayı şimdilik tercih ediyorum.
Anlayacağınız artık beni daha yakından takip etmek isteyenler bunu twitter
ile yapabilecekler :) http://twitter.com/daronyondem
adresinden beni kendi profilinize ekleyebilirsiniz. Sadece seminer ve
aktiviteleri değil "Taksim Bambideyim" şeklinde mesajları da yazmayı
düşünüyorum :) belki beraber birer ıslak hamburger yeriz :)
twitter Silverlight uygulaması yollarında...
Twitter'daki son 5 postun blogumda da gözükmesi için twitter'ın kendi
sitesindeki araçlara baktığımda HTML ve Flash içerikli uygulamalar gördüm.
Özellikle HTML ve JavaScript ile yapılana bakınca aslında istemciye JSON
formatında veri gönderdiğini görerek biraz güldüm. Çünkü bu veri kaynağı ile
kolaylıkla bir Silverlight uygulaması yapılabilirdi. Ve yaptım :) Hemen sitenin
yan tarafında çalışır halini görebilirsiniz. Tabi ki uygulamanın açık kaynak
kodlarını da sizlerle paylaşıyorum.
Kolay gelsin ;)
twitter.com Silverlight uygulaması - 16052008_1.rar (6,69 KB)
Bugün Konya, Selçuk Üniversitesin'deydim. Sabah 10.00'da
başlayarak 19.00'a kadar WPF, AJAX, Silverlight ve LINQ
konularını inceleyen bir seminer ile güzel bir gün geçirdik. Umarım "yol
yorgunluğum" aktiviteye çok yansımamıştır. Bir gün öncesinde bildiğiniz üzere
Çanakkale 18 Mart Üniversitesin'deydim ve akşam 23.00'da Çanakkale'den mecburen
otobüs ile İstanbul'a döndüm. O saatte uçak vs yok. Sabaha karşı 05.00'de
İstanbul'daydım ve 07.00 uçağı ile Konya'ya uçtum :) Durum böyle olunca hem
uykusuzluk (buna alışkınım aslında) hem de sadece uçakta verilen abuk sandwich
nedeniyle açlık (işte buna dayanamam!) nedeniyle performansımdan şüphe etmediğimi
söylesem yalan olur.
 Konya, Selçuk Üniversitesi
Aktivitede katkılarından dolayı sevgili MSP, Okan Öztürkmenoğlu'na
çok teşekkür ediyorum. Bereketine hayran kaldığım etli ekmek desteği ile tüm
günü ayakta geçirebilmeme büyük katkıları oldu :)
Tekrar görüşmek üzere ;)
Bugün Çanakkale 18 Mart Üniversitesi'ndeydim. WPF
ve Silverlight konulu toplam 6 saatlik bir seminerin sonunda
ilk defa bir üniversitenin öğrencilerinden bu kadar çok iltifat duydum :)
Hepiniz çok sağ olun arkadaşlar. Benim için de çok zevkli bir gündü, böyle
ilgili bir kitleyle birşeyler paylaşabiliyor olmak gerçekten muhteşem. Özellikle
bir arkadaşın "Uzaktan küçük gözüküyorsunuz hocam" yorumunu sanırım
hayatım boyunca unutmayacağım :)
 Çanakkale 18 Mart Üniversitesi, WPF ve Silverlight Semineri
Organizasyonla ilgili özellikle sevgili Erçin Yontar'a çok
teşekkür ediyorum. Çanakkale zaten bana yabancı olmayan bir şehir :) yine de
sevgili Erçin iskeleden alıp iskeleye kadar yolculadı beni :) Herşey için çok
çok teşekkürler arkadaşlar, tekrar görüşmek dileği ile ;)
Bugün INETA ve BilgeAdam işbirliğinde "Silverlight"
eğitiminin ikinci gününü zevkli bir şekilde sonlandırdık. Eğitim yanlışlıkla
".NET altyapılı" diye duyurulunca tüm katılımcıların "Silverlight 2.0"
bekleyerek geldiklerin için eğitimin bu ikinci gününde Silverlight ile Veri
İşlemleri kısmını Silverlight 2.0 ile yaptık. Sanırım bundan
sonra yine katılımcıların istekleri çerçevesinde sürekli Silverlight 2.0 ile
beraber devam ediyor olacağız. Bu kapsamda aslında Türkiye'deki ilk Silverlight
2.0 eğitimini yapıyoruz :)
 INETA ve BilgeAdam işbirliğinde Silverlight 2.0 Eğitimi
Tabi konu Silverlight 2.0 olunca ve arkada .NET olunca her zamanki gibi "biz
(VB) ve siz (C#)"li sohbetler yapar olduk. Özellikle Silverlight 2.0 ile istemci
tarafında XML ile uğraşırken VB'nin XLINQ ile inline XML kolaylıklarının
yadsınamayacak olduğunu sanırım kanıtladım :)
Gün boyunca yaptığımız örneklere ait kaynak kodlarını aşağıdaki adresten
indirebilirsiniz. Sonuncusu çalışmıyor :) zamanımız yetmedi bitirmeye.
Eğitim Uygulamaları Proje Kodları - 04052008_2.rar (2,6 MB)
Katılan herkese çok teşekkürler.
Silverlight çılgınlığı aldı başını gidiyor :) Spike Xavier ve Dan Wahlin
tarafından hazırlanmış Silverlight şarkısını aşağıdaki adresten bilgisayarınıza
indirebilirsiniz.
http://www.xmlforasp.net/CodeBank/Download/Blog/Music/Silverlight.mp3
Şarkının sözleri şu şekilde;
feed this need for quality
vector based delivery
we write it in xaml, we roll like a caml
we love it like baml
3D dioramma
lightweight subset of the CLR
down the wire with fluidity
you won't believe it, if you can conceive it
your users retrieve it
and their minds receive it.
it's Silverlight
it's strong and tight
they got it right
try it tonight
take the web to a brand new height
:) Bizde de var mı böyle yetenekli gençler? ;)
Dün İstanbul Aydın Üniversitesi'nde "Yazılım Dünyasına
Yeni Teknoljiler:WPF ve Silverlight" konulu mini bir seminer verdim. Bu
tarz mini seminerler maalesef ayrıldığımız içimde bir burukluk bırakıyor.
İstediğim herşeyi anlatamamış olmak gerçekten çok üzücü. Yine de seminer sonunda
çoğu dinleyiciden çok olumlu tepkiler aldım.
 İstanbul Aydın Üniversitesi, Silverlight ve WPF
Katılan arkadaşlara ve özellikle organizasyondaki emeği için
sevgili Halit Kara'ya çok teşekkür ediyorum. Umarım yakında daha uzun süreli bir
aktivite ile tekrar görüşürüz.
Dün Şanlıurfa Harran Üniversitesi'nde Silverlight
seminerindeydim. Gerçekten muhteşem iki gün geçirdim Şanlıurfa'da. Sanırım
hayatımda bu kadar sıcak kanlı insanlar görmemişimdir. Gerçekten herkes bir
"turist" olarak bana çok yardımcı oldu. İlginç bir hava var şehirde, herkes
mutlu, stressiz bir yaşam hakim gibi. Belki de sadece bana öyle yansıdı :)
Bu sefer fırsat bularak yarım gün kadar Urfa'yı gezme şansım da oldu.
BalıklıGöl'den tutun Konak'lara kadar epey gezdim. Şansıma hava da çok güzeldi,
serin bir esinti ve güneş ışığı eşliğinde Urfa'lıların deyimine göre en iyi
vaktini yakalamışım şehrin. Dönüşte İSOT ve Nar Ekşisi almayı da tabi ki
unutmadım :)
 Silverlight Semineri, Harran Üniversitesi, Şanlıurfa
Harran Üniversitesi'ndeki gençler gerçekten çok ilgiliydi Silverlight
konusunda. Özellikle seminer sonunda PHP ile Silverlight kullanma konusunda
hevesi gözünden okunan arkadaşlar vardı :) Silverlight örnekleri içerisinde
gösterdiğim ASP.NET AJAX özellikleri de çoğunun ilgisini çekti. Sanırım mini bir
MS rüzgarı estirdim :) Her zamanki gibi tabi ki zaman yine yetmedi herşeyi
anlatmaya.
Buradan özellikle sevgili Bilgisayar Bölümü Bölüm Başkanı Yrd. Doç. Dr. Nurettin Beşli'ye ve Bilişim Kulübü
Başkanı Celal Savur kardeşime çok teşekkür etmek istiyorum.
Muhteşem bir organizasyondu.
Seminerde yaptığımız örneği ve sunumumu aşağıdan indirebilirsiniz.
Seminer Örnek Kodları ve Sunum - 18042008_1.rar (1,71 MB)
NETRON ve INETA işbirliğinde yaptığımız 3
günlük Silverlight eğitimini bu sefer de BilgeAdam ve
INETA işbirliği ile tekrar ediyoruz. Özellikle "tekrar" kelimesini
kullanıyorum ki aynı arkadaşlar gelmesinler :) Yanlış anlamayın "başımın
üstünde" yeriniz var ama gerek yok :) Aynı konular, sıkılırsınız.
Peki bu eğitime seçilecek şanslı kişilerden biri olmak için ne yapmamız
gerekiyor? www.yazilimuzmani.com
adresine giderek "Seminerler" kısmında söz konusu aktiviteye kayıt olmalısınız.
Haber vermedi demeyin :)
Hepinize iyi şanslar ;)
Bugün Ankara, Gazi Üniversitesi'nde 4 saatlik bir Silverlight seminerim
vardı. Seminerin başından sonuna kadar salonda kalarak beni 4 saat boyunca
dinlemek gerçekten Silverlight'a olan ilginin ciddi bir kanıtıdır sanırım.
Buradan tüm katılımcılara, Bilgoloji grubuna ve sevgili Veysel Uğur KIZMAZ'a organizasyondaki emekleri için çok teşekkür ediyorum.
 Silverlight Semineri, Gazi Üniversitesi, Ankara
Seminer boyunca yaptığımız örneği ve kullandığım sunumu aşağıdaki adresten
indirebilirsiniz.
Örnek Uygulamalar ve Sunum - 15042008_1.rar (2,98 MB)
Öğrencilerimle gurur duyuyorum :) "Öğrencilerim" dedikçe kendimi biraz
yaşlandırdığımın farkındayım ama gerçekten çok gurur verici bir tablo söz
konusu. Karşınızda yepyeni bir Silverlight 1.0 oyunu daha! Bu sefer oyunumuz Windows ile beraber gelen alıştığımız "Mayın Tarlası". Sevgili
Melih Kemal Tekin
tarafından hazırlanan oyunu aşağıdaki adresten oynayabilirsiniz.
http://www.softencrypt.com/mines/
Ben olsam oyunun kaynak kodlarını da incelerdim :)
Teşekkürler Melih...
SharePoint Server artık sadece bir şirket içi iletişim ve
paylaşım alanı olmanın ötesinde internete açık web sitelerinin altyapısında da
rahatlıkla kullanılıyor. Her iki ihtimalde de SharePoint üzerinde Silverlight
kullanımı farklı olanaklar tanıyabilir. Örneğin şirket için canlı video yayını
dağıtımlarınızı SharePoint ve Media Services ile
Silverlight aracılığı ile
kullanıcılara yansıtabilir veya şirket içi eğitim videolarınızı Silverlight ile
SharePoint üzerine yerleştirebilirsiniz. Tabi ki SharePoint'in web servislerine
bağalanarak AJAX aracılığı SharePoint'in dahili verisine bağlanarak çok daha
farklı senaryolar da gerçeleştirilebilir.
Peki SharePoint içerisinde Silverlight'ı nasıl kullanacağız?
SharePoint içerisinde Silverlight kullanımı ile ilgili yayınlanmış olan bir
paket var. Bu paketi sunucuya yüklemenizle beraber artık SharePoint üzerinde
size özel bir WebPart'ınız oluyor. Bu WebPart'ı herhangi bir WebPartZone'a
ekleyerek istediğiniz Silverlight uygulamasının söz konusu alanda çalışmasını
sağlayabiliyorsunuz. Özetle, aslında WebPart'ımız Silverlight uygulamalarımız
için bir HostElement görevi görüyor.
Software & Services BluePrints çerçevesinde yayınlanan paketin adı
Silverlight BluePrint for SharePoint şeklinde. Aşağıdaki adresten söz konusu
paketleri ve örnekleri indirerek sunucunuza kurabilirsiniz.
http://www.ssblueprints.net/sharepoint/
Maalesef bu adresteki çoğu örnek Silverlight 2.0 ile hazırlanmış durumda.
"Maalesef" dememin nedeni daha Silverlight 2.0'ın Beta 1 sürecinde olması ve
kesinlikle kullanımdaki sunucularınıza SL 2.0 ile ilgili yüklemeleri yapmamanız
gerektiği. Bu durumda hızlı bir şekilde yukarıdaki adresteki ilk örnek olan
"Hello Silverlight Web Part"ını yükleyerek işe başlayabiliriz. Bu yükleme paketi
içerisinde SilverlightPart'ın yüklemesi de bulunuyor. SharePoint'e Silverlight
uygulaması yüklemek için kullanacağımız esas WebPart da zaten bu. WebPart şu
anda SL 2.0 da desteklediği için bazı durumlarda SL2.0 yüklemeleri de yapmamız
şart.
"Setup_SilverlightPart.zip" adındaki dosyanın içerisinde yüklemeyi
tamamlamanız yeterli olacaktır. Diğer yüklemeler sadece örnek uygulamalar
içeriyor. İşimiz bitti zannediyorsanız aldanıyorsunuz. Daha yapmamız gereken
birçok iş var. Gelin sunucuda yapılması gerekenleri bir liste haline getirelim.
- Silverlight
BluePrint sitesinden ilk örneği indir ve içerisindeki
Setup_SilverlightPart.zip dosyasında yüklemeleri yap.
-
Silverlight Plug-In'i sunucuya yüklemeniz gerekiyor. (Sorun yaşarsanız
SL
2.0 Plug-In'i de yüklemek durumunda kalabilirsiniz)
-
Silverlight 2 Beta 1 SDK'nın sistemde yüklü olması gerekiyor.
- "C:\Program Files\Microsoft SDKs\Silverlight\v2.0\Libraries\Server"
adresinden System.Web.Silverlight.dll dosyasını "C:\windows\assembly"
adresine kopyalayın.
- SharePoint web sitenizin altındaki /ClientBin/ klasöründe doğru Silvelight.js
dosyasının bulunduğundan emin olun. Eğer yoksa "C:\Program Files\Microsoft
SDKs\Silverlight\v2.0\Tools" adresinden söz konusu dosyayı kopyalayın.
- IIS üzerinde XAML ve kullanacaksanız SL 2.0 için XAP Mime Type ayarlarını
yapmanız gerekecek. Ayarlar şu şekilde olmalı.
Extension: .xaml / MIME Type:
application/xaml+xml
Extension: .xap / MIME Type:
application/x-silverlight-2-b1 (Sadece SL 2.0 Beta 1 için özeldir)
- Son olarak IIS'e ufak bir reset ile işlemi tamamlayabiliriz.
SilverlightPart'ın kullanımı üzerine...
SharePoint sunucumuza yüklediğimiz SilverlightPart
özelliğini aktif hale getirmek için ilk olarak "Site Actions / Site Settings /
Modify All Settings" menüsünden yola çıkarak "Site Collection Features" kısmına
gitmemiz gerekiyor. Burada yüklemiş olduğunuz SilverlightPart'ı göreceksiniz,
hemen yanında "Activate" düğmesi ile özelliği aktif hale getirebilirsiniz.
 SilverlightPart özelliğini aktif hale getirdik.
Artık herhangi bir sayfada WebPart olarak SilverlightPart'ımızı
ekleyebiliriz. Sayfalarımızda "Add a WebPart" dedikten sonra karşımıza gelen
listeden SilverlightPart'ımızı seçebiliyoruz. Ekleme işlemini tamamladıktan
sonra sıre geliyor ayarlara. WebPart'a ait "Tool Pane"'i açtığınızda karşınıza
bazı seçenekler gelecek. Bu seçeneklerden ilki SharePoint sitenize koyacağınız
Silvleright uygulamasının hangi sürüm için hazırlanmış olduğu. Eğer 2.0 için
hazırlanmış ise sizden bir XAP dosyası seçmeniz istenecek. Eğer SL 1.0 için
hazırlanmış bir uygulamayı sitenize yerleştireceksiniz bu sefer de XAML
dosyasını seçmeniz gerekecektir. SL 1.0 uygulamanızın arkaplanında bir
programlama yapıldıysa ayrıca "Include JavaScript" işaretini de işaretleyerek
uygun JavaScript dosyasını seçmeniz şart. Bahsettiğimiz bu JavaScript dosyası
Expression Blend 2 ile yaratılmış bir projedeki
Page.xaml.js dosyasına denk geliyor. Yani hiçbir şekilde
Silverlight.js veya default.html.js içerisinde yapılan
işlemlerin yapılmasına veya söz konusu dosyalardaki kodların bu tarafa
taşınmasına gerek yok çünkü SL uygulamasının yaratılması ve sayfaya
yerleştirilmesi işini SilverlightPart yapacak, yani gerekli
JavaScript kodlarını kendisi yaratacak.
 SilverlightPart ayarları.
Tüm ayarlarımızı tamamladığımıza göre artık "OK" düğmesine basarak sayfamızda
Silverlight uygulamamızı rahatlıkla çalıştırabiliriz. Peki bu seçtiğimiz XAML,
XAP ve JavaScript dosyaları nerede? SharePoint web sitenizin içerisindeki
ClientBin klasörü içerisinde koyduğunuz tüm dosyalar
SilverlightPart içerisinde seçilebilir hale gelecektir.
Hepinize kolay gelsin.
Bugün Swiss Hotel'de düzenlenen Microsoft SharePoint Konferans
serisinin İstanbul ayağında Silverlight BluePrint ile SharePoint
entegrasyonu konusunu işledik. 50 dakika gibi kısa bir sürede hem Silverlight'ın
sektördeki yerine hem SharePoint ile beraber kullanılmasına değindim.
 Microsoft SharePoint Konferansı, İstanbul
Normalde SharePoint ile ilgili yazılar yazmıyorum ama özellikle dünki
aktiviteye katılan arkadaşlara not olması amacıyla SharePoint ile Silverlight
entegrasyonundan bahsettiğim bir makaleyi yarın bloguma ekleyeceğim. Yarın da sizi bloguma beklerim ;)
Son iki gündür KKTC'de Uluslararsı Kıbrıs Üniversitesi'ndeydim.
İlk gün güzel bir WPF semineri yaptık, ikinci gün de
Silverlight ile yolumuza devam ettik. Önce WPF sonra
Silverlight yapmanın büyük avantajları var. Malum WPF
Silverlight'in babası kıvamında o nedenle Silverlight tarafına geçildiğinde çoğu
şeyi anlatmaya gerek kalmadan veya hızlı bir şekilde geçerek webin detaylarına
girebildik. Silverlight ile beraber mini bir AJAX uygulamamız da oldu. Üzerinden
yıllar geçmesine rağmen ve WPF veya Silverlight
ile karşılaştırıldığında ciddi eski bir konu diyebileceğimiz AJAX hakkında hala
ciddi bir bilgi eksikliğimizin olması beni ciddi şekilde şaşırtıyor. Özellikle
ASP.NET ile beraber gelen AJAX'ın sektördeki konumlandırılması gerçekten çok
yanlış. Bu hem üniversitelerde hem de en büyük şirketleri de aynı :( Neyse,
konuya dönelim :)
 Uluslararsı Kıbrıs Üniversitesi, KKTC
İki gün boyunca Uluslararsı Kıbrıs Üniversitesi'nden genç
kardeşlerim beni çok iyi bir şekilde ağırladılar. Bu kadar sıkça Kıbrıs'a gitmeme
rağmen ilk defa bir gece kaçarak Girne'yi görme şansım oldu. Benim aklıma
Bozcaada sahillerini getirdi. Gerçekten güzeldi.
Umarım seminerler herkes için faydalı olmuştur. Buradan özellikle sevgili
CompSciSociety Başkanı Burç Kaan ŞEN'e ogranizasyondaki
başarısı ve yardımları için çok teşekkür ediyorum. Ayrıca soyadını maalesef
hatırlayamadığım :) fotoğrafları çeken Yasin'e de çok teşekkürler. Gerçek bir
fotoğrafcılık aşığı.
Bugün NETRON ve INETA işbirliğinde
düzenlediğim üç günlük Silverlight eğitiminin son gününde "Silverlight
ile Video Uygulamaları"nı işleyerek eğitim serimizi sonlandırdık. Daha
öncesinde zaten Silverlight ile animasyon ve veri işlemlerini detaylı olarak
incelediğimiz için hızlı bir şekilde video özelliklerini de hallederek gerçek
bir projeye geçiş yaptık. Sınıfımızda hem programcılar hem tasarımcılar olduğu
için sınıfı ikiye ayırdık. Hedefimiz bir video yayın sitesi yapmaktı. Sitenin
yönetim panelini ASP.NET 3.5 ile XLINQ kullanarak programcılarımız hazırladı,
Silverlight uygulamasının tasarımını ve animasyonları da tasarımcılarımız
Expression Design ve Blend ile düzenledi. En sonunda her iki sistemi de
birleştirerek bir güne sığacak şekilde güzel bir ürün çıkardık.
 Silverlight ile video uygulamaları gün sonu.
Projeye ait kaynak kodlarını aşağıdaki linkten bilgisayarınıza indirebilirsiniz.
Projenin özelliklerine kabaca bakacak olursak aşağıdaki konuları kapsadığını
söyleyebiliriz;
- AJAX ile Silverlight veri bağlantısı
- Dinamik Silverlight içeriği yaratılması
- Video oynatımı
- Tam ekran Silverlight uygulama yönetimi
- Video dosyalarının önbellekleme kontrolü
- Animasyon kullanımı
- XLINQ ve C#
Proje Kaynak Kodu - 05042008_2.rar (44,51 KB)
Projenin çalışır halini aşağıdaki adresten inceleyebilirsiniz.
http://daron.yondem.com/samples/sl10video_ineta/
Eğitime başından sonuna katılan herkese çok teşekkürler. Tekrar görüşmek üzere
;)
Bugün Yeditepe Üniversitesi'ndeydim. Uygulamalı mini bir
Silverlight eğitimi planlarken bilgisayarların azizliğine uğradık. Bunun üzerine
biz de uygulamasız olarak Silverlight, AJAX ve WPF konularına ışık hızıyla göz
attık. Özellikle katılımcıların "eğitim" konseptine uygun kalabalıkta olması
aslında normalde giremeyeceğimiz detaylara girebilmemizi sağladı.
 Yeditepe Üniversitesi, Silverlight
Buradan organizasyonda emeği geçen tüm Bilgisayar Kulübü'ne ve özellikle
sevgili MSP, Ümit Büyükabalı'ya çok teşekkür ediyorum.
INETA ve NETRON işbirliği ile yürüttüğümüz 3 günlük Silverlight eğitimi
serisinin son gününü Cumartesi NETRON Altunizade şubesinde gerçekleştireceğiz.
Daha önceki katılımcıların yarın telefon ile aranacak, ayrıca bu son güne
gelemeyenlerine yerine ve salonu büyüttüğümüz için alabileceğimiz yeni
katılımcılar için de tekrardan yeni talihliler seçileceği için benim tavsiyem
eğer Silverlight ile Video uygulamalarıyla ilgileniyorsanız
hemen aşağıda formu doldurarak kayıt olmanızdır. Talihliler yarın öğleden sonra
telefon ile NETRON tarafından aranacak.
PCnet'in Nisan sayısındaki yazılarımı her ay olduğu gibi yine buradan sizlere duyurmak
istiyorum :) Derginin
OKUL bölümünde AJAX, ASP.NET 3.5,
Expression Blend ve Silverlight ile ilgili yazılarım yer alıyor.
AJAX : ASP.NET AJAX İstemci Özellikleri
Expression Blend : WPF ile zengin doküman uygulamaları
Silverlight: Silverlight ve video dünyası
ASP.NET 3.5 : Bir sitenin ekran görüntüsünü ASP.NET ile nasıl
alırsınız? Hepinize sevgiler.
Bugün ODTÜ Bilgisayar Mühendisliği Bölümü'nde uzun soluklu
bir Silverlight ve AJAX semineri düzenledik. Seminer boyunca
gerçekten çok güzel sorular geldi. Katılımcıların yarısı her zamanki gibi ilk
bir saatte salonu terk etti ve esas programcılar ile biz bize kaldık :) Zaten o
noktadan sonra kalan ilgili dinleyiciler ile sanırım seminer 10 saat bile sürse
sorun olmazdı.
 ODTÜ, Silverlight ve AJAX Semineri
Buradan özellikle ODTÜ'den sevgili Arş. Gör. Serdar Çiftçi'ye
aktiviteye katkılarından dolayı teşekkür ediyorum. Seminer sonrasında beni
yalnız bırakmayan MSP'lerimiz
Ali Rıza Babaoğlan,
Murat Duman ve sevgili
Tayfun Akçay'a da ayrıca teşekkür ediyorum. Güzel ve eğlenceli bir akşam
geçirdim sayelerinde :)
Silverlight 2.0 yazılarıma başladığım günlerde aklıma olmasına rağmen
atladığım bir yazıyı bugün sizlerle paylaşıyorum. Seminer ve eğitimlerde
karşılaştığım kadarıyla hem Silverlight'ın sürümleri arasında hem de Silverlight
ile geliştirme yapılacak araçların sürümleri arasında ciddi bir kafa karışıklığı
söz konusu. Gelin elde neler var, ve ne yapmak için ne kullanmamız gerekiyor bir
göz atalım.
Expression Blend : Blend'in ilk sürümünde WPF uygulamaları
geliştirebilirsiniz fakat Silverlight uygulaması geliştiremezsiniz. Bunun nedeni
aslında çok basit. Blend ilk çıktığında ortada Silverlight diye birşey yoktu. O
nedenle ürün içerisinde de böyle bir destek yok. Özetle Expression Blend'in ilk
sürümünün SL dünyasında yeri yok.
Expression Blend 2 : Blend'in bir sonraki sürümü olan Blend
2'nin Nisan ayı içerisinde satışa sunulması yani "release" olması bekleniyor. Bu
sürüm içerisinde tabi ki Silverlight 1.0 desteği var. Şu an Blend 2'nin
Beta'sını indirerek bilgisayarınızda çalıştırabilir ve SL 1.0 uygulamaları
geliştirebilirsiniz. Adı sonradan SL 2.0 olarak değiştirilen SL 1.1 uygulamaları
da yine Blend 2 içerisinde geliştirilebiliyordu fakat bu sistem değişti. Artık
SL 1.1 kalmadığına göre zaten bu kullanımın da doğru olduğunu söyleyemez. Daha
önceleri SL 1.1 kullananlara tavsiyem sistemlerindeki SL 1.1 ile ilgili herşeyi
kaldırmaları.
Expression Blend 2.5 : Silverlight 2.0 uygulamaları geliştirmek
istiyorsanız Expression Blend 2.5 ile yola çıkmanız gerekiyor. Unutmayalım ki SL
2.0 daha Beta 1 aşamasında bu nedenle Blend 2.5 de Preview sürümü ile karşımıza
çıkıyor.
Microsoft Silverlight 1.0 Software Development Kit :
Silverlight 1.0 ile ilgili uygulama geliştiriyorsanız sisteminize bu paketi
yükleyerek hem yardım dosyalarından hem de Visual Studio'ya entegre olan SL
Proje şablonundan faydalanabilirsiniz.
Microsoft Silverlight Tools Beta 1 for Visual Studio 2008 :
Adından pek anlaşılmasa da aslında bu paket SL 2.0 için hazırlanmış durumda. VS
içerisinde SL 2.0 proje şablonlarını ve gerekli Intellisense desteğini yüklüyor.
Paket içerisinde aslında ayrıca da indirilebilen
SL 2.0 BETA SDK da bulunuyor.
Benim her zamanki tavsiyem SL 2.0 ile ilgili yüklemeleri SL 1.0 uygulaması
geliştirdiğiniz makinelere yapmamanız yönünde. Mümkünse bir sanal makine
kullanarak SL 2.0 uygulama çalışmalarınızı söz konusu makine üzerinde devam
ettirin.
Hepinize kolay gelsin.
TBD ve INETA işbirliğinde yaptığımız "4 Konu, 4 Gün" eğitimlerinin ikinci gününde bugün Silverlight'a
değindik. Yine çok zevkli bir gün geçirdim. Günün sonunda Silverlight
uygulamaları, animasyonları yapabiliyor, hatta bunları sunucu tarafındaki veriye
de bağlayabiliyorduk. Tabi bir önceki günde AJAX'ı işlemiş olmamız işimizi epey
kolaylaştırdı. Dersin sonunda elde ettiğimiz örneğin kodlarını aşağıdan
indirebilirsiniz.
Örnek Uygulama Kaynak Kodu - 30022008_1.rar (8,17 KB)
Günün sonunda yine 17.30 civarı fire vermeye başladık. Aslında bu durum
yapacağımız çekilişe kalanların şansını arttırdı :) Ne çekilişimi mi? Kendi
yazdığımız bir program aracılığı ile (hiç sormayın) yaptığımız çekişle bir
kişiye Vista Ultimate, SQL 2008 CTP, Visual Studio 2008 Trial ve Server 2008
Trial orijinal DVD'leri ile beraber bir de "Heroes Happen Here" kitap hediye
ettim. Özetle çok zevkli bir gündü haftaya Pazar tekrar görüşmek üzere.
 "4 Konu, 4 Gün" Silverlight Günü
Son iki gündür Isparta, Süleyman Demirel Üniversitesi'ndeydim.
İki gün boyunca Silverlight, WPF, ASP.NET 3.5 AJAX ve LINQ
konularına değindik. SDÜ zaten daha önce de öğrencilerinden bana gelen soru
mailleri ile beni şaşırtan bir üniversite olmuştu. Bu ziyaretimde de epey şaşkın
anlar yaşadım. Peki neye şaşırdım? SDÜ'de şu an Silverlight ve WPF konularında
bitirme projeleri hazırlayan kardeşlerimiz var. Daha çoğu üniversitede bu
konuların birer mistik ütopya olarak dolaştığını düşünürsek SDÜ öğrencileri
ciddi şanslı. Seminerler boyunca gelen sorular ortalamanın çok üstünde bir
seviyeye sahipti.
 Süleyman Demirel Üniversitesi, Isparta
Buradan özellikle SDÜ'den sevgili Eğitim Görevlisi dostum Mehmet
Albayrak'a ilgisi, misafirperverliği ve organizasyondaki katkısı için
çok teşekkür ediyorum. Ayrıca tabi ki güler yüzleri ve teknoloji aşkları ile
beni hem şaşırtan hem de sevindiren katılımcılara, SDÜ öğrencilerine de çok
teşekürler. Kısa zamanda yakaladığım ufak bir manzara fotoğrafı ile buradan
Ispartaya tekrar selamlar.
 Eğirdir Gölü Tepesi, Isparta
Dün INETA ve NETRON sponsorluğundaki Silverlight eğitimimizin ikinci gününü
"Silverlight ile Veri Uygulamaları" konusu ile tamamladık. Eğitim çok zevkli
geçti. Öğlen yemeği için topluca Capitole'e gittik :) Çıkışta öğrencilerimden
Oğuzcan Şahin benimle bir röportaj yaptı :) Sanırım yakında bir şekilde
yayınlayacaktır, buradan da size haber veririm röportaj yayına girdiğinde.
Terletici sorular vardı.
 Silverlight Eğitimi 2. Gün
Eğitim günün sonunda yaptığımız Silverlight uygulamasının kaynak kodlarını
aşağıdan indirebilirsiniz. Katılımcı arkadaşların her birine tek tek ilgileri ve
yoğu konsantransyonları için teşekkür ediyorum.
Örnek Kaynak Kodu - 23032008_1.zip (11 KB)
Ücretsiz eğitim konseptinde düzenlediğimiz INETA ve NETRON sponsorluğundaki
Silverlight 1.0 eğitimine gelen ve gelmeye devam eden büyük ilgi daha önce de
tahmin ettiğim bir durumdu. Bu konuda maalesef "talihli" olamayıp seçilemeyen
arkadaşlar haklı olarak sitemkar mailler gönderiyorlar. Emin olun bu tarz
aktivitelere devam edeceğiz, mekan sponsorları aramaya devam ediyorum.
Bundan yaklaşık bir ay kadar öncesinde sevgili Burcu Kutlu
ile temellerini attığımız bir diğer etkinliği bugün sizlere duyurmak istiyorum.
Bu sefer de INETA ve TBD Genç işbirliği ile
birer tam günlük dört farklı konuda bilgisayar başında eğitimler açıyoruz. "Bir
günlük eğitim mi olur?" derseniz aslında haklısınız ama en azından kendi
adıma düşündüğümde 3 saatlik seminerlerimden sonraki adım diyebilirim. Diğer
Silverlight eğitimini 3 gün olarak tasarlamıştık. Umarım yakında bu gibi
ücretsiz eğitimlerin sayısını arttıracağız. Bu seferlik dört konu, dört gün ;)
23 Mart - ASP.NET 3.5 AJAX
30 Mart - Silverlight
6 Nisan - Expression Blend ve WPF
13 Nisan - ASP.NET 3.5 ve LINQ
Eğitim saatleri her gün 10.00-18.00 arasında, eğitim yeri
TBD İstanbul (Ali Ruhi Sok. No:2, K.3, Hasanpaşa/ Kadıköy).
Kayıt için bu adresi kullanabilirsiniz;
http://www.tbdgenc.org/index.php?page=activityjoin&lang=tr&id=29
Buradan özellikle tekrar sevgili Burcu Kutlu'ya aktivitenin
organizasyonundaki yoğun emekleri için çok teşekkür ediyorum.
Seminerlerde, videolarda ve geçen gün lansmanda üzerimdeki
Silverlight T-Shirt'ü büyük beğeni kazandı :) O kadar ki bir an tekstil
sektörüne girsem mi diye düşünmedim değil. Maalesef beğenilerini bana "Ben
de istiyorum o T-Shirt'ten" şeklinde ileten arkadaşların hepsine birer
T-Shirt hediye etmem mümkün olmayacak :) Onun yerine daha güzel birşey yaptım (en azından benim için daha güzel :)) ve
kendi T-Shirt'ümün baskısını da yaptırmış olduğum
Tish-O ile iletişime
geçerek aynı tasarımın siteye yerleştirilmesini ve böylece herkesin sipariş
verebilmesini sağladım :)
 Orijinal Tasarımlar
Tish-O'nun arayüzünü kendi sitesine girdiğinizde zaten rahatlıkla
keşfedebilirsiniz. Farklı bedenlerde ve stillerde T-Shirt siparişi verebiliyor,
tasarımınızı kendiniz yapabiliyorsunuz. Baskı kalitesi şaşırtıcı derecede iyi,
benim T-Shirt yaklaşık 6, 7 defa yıkanmasına rağmen en ufak bir baskı sorunu
yok.
Siteden Silverlight T-Shirt sipariş verebilmek için yapmanız
gerekenleri bir iki adımda göstermek istiyorum.
 Tish-O sitesinde adım 1.
Herhangi bir T-Shirt tasarımı yaparken T-Shirt'ün ön ve arka yüzüne hazır
Silverlight tasarımlarını yerleştirerek sipariş verebilirsiniz.
 Tish-O sitesinde adım 1.
Görselleri ekledikten sonra sitedeki arayüzde basılacak boyutu da
ayarlayabiliyorsunuz. Artık hepinizi bir sonraki seminerde Silverlight
T-Shirt'leri ile bekliyorum. Kahramanlar aramızda ;)
Silverlight uygulamalarında kullandığımız XAML dosyalarının bazı durumlarda
IIS tarafından istemciye gönderilmediğinden daha önceki yazılarımda
bahsetmiştim. Bazen bu durum özellikle sunucu admini (hosting sağlayıcı)
tarafından ek ücret talebi yapabilmek adına kasıtlı olarak yapılabildiği gibi
bazen de gerçekten ortada bir sorun olabiliyor. Peki nasıl düzelteceğiz?
MIME Type tanımı nasıl yapılır?
Silverlight XAML dosyalarının IIS tarafından istemciye sunulabilmesi için
aşağıdaki şekilde gerekli MIME type'ların tanımlanması gerecektir.
Dosya uzantısı: .xaml
MIME type: application/xaml+xml
Dosya uzantısı: .xap
MIME type: application/x-silverlight-app
XAML'ı biliyorduk da XAP da nesi? :) XAP şu an Silverlight 2.0 Beta 1 ile
beraber kullanılan bir dosya uzantısı. Eğer olur ya bir fantezi çerçevesinde
Silverlight 2.0 Beta 1 ile sanal makinenizde geliştirdiğiniz bir uygulamayı
sunucuya koymak isterseniz şu an için XAP dosyaları için de gerekli MIME
Type'ları tanımlamanız gerekecektir. İleride Silverlight 2.0'ın yayına çıkacak
orijinal sürümlerinde bu uzantının kullanılmaya devam edeceği tabi ki garanti
değil. Bahsettiğimiz teknoloji daha beta aşamasında.
Gelelim bu tanımlama işini nasıl yapacağımıza. Sunucuda IIS Manager'ı
açtıktan sonra MIME Type ayarı yapmak istediğiniz siteyi
seçerek sağ tuş tıklayarak gelen menüden "Properties" komutunu
veriyoruz. Karşımıza gelen pencereden "HTTP Header" sekmesine geçerek en alttaki
"MIME Types" düğmesine tıklıyoruz.
 IIS Manager içerisinde MIME Types seçeneğini bulduk.
"MIME Types" bölümüne girdikten sonra hemen "New" düğmesine tıklayarak yeni bir
"MIME Type" eklemek üzere bir önceki paragraftaki ayarları buraya aynen
yazıyoruz ve gördüğümüz tüm "OK" düğmelerine basarak IIS Manager arayüzüne geri
dönüyoruz.
 Yeni bir MIME Type ekliyoruz.
Artık gerekli uzantılar tanımlandığı için herhangi bir sorun
yaşamayacağız.
Hepinize kolay gelsin.
Sizlerle blogumdan paylaştığım makalelerin çoğunu
yazgelistir.com
üzerinden de okuyucularla paylaşıyorum. Bunun nedeni daha önce birkaç kez
yazmıştım; malum herkes benim blogumu takip etmeyebilir. Yazılarımın daha geniş
bir kitleye ulaşması için farklı sitelerde aynı yazılarımın yayınlanmasını
faydalı görüyorum.
Bugün güzel bir gelişme oldu ve
yazgelistir.com'da
Silverlight bölümü açıldı. Bu güzel haberle beraber ben de söz konusu
bölümün editörü oldum. Buradan tüm YazGeliştir ekibine ve
özellikle Işıl
Orhanel'e ilgisi ve çalışması için teşekkür ediyorum. Artık bir
YazGelistir yazarı olarak Silverlight makalelerimi yazdıktan sonra bir
YazGelistir editörü olarak da kendi makalelerimi onaylayabileceğim :) Hoş bir
duygu. ;)
Bugün
INETA ve NETRON sponsorluğunda
Silverlight Workshop serimizin ilkini gerçekleştirdik. Sabah 10.00'da
başlayarak gerekli yüklemelerimizi de yaptıktan sonra 18.00'e kadar sanırım
sadece bir teneffüs ve öğle yemeği molası ile yoğun bir maraton yaptık.
Gerçekten büyük zevk aldım, eğlendim :) Güzel bir pazar günü oldu.
 Silverlight Workshop Gün 1
Workshop'un sonraki günleri için katılımcılar tekrar telefon ile aranarak
onaylanacak. Şu anki katılımcılardan sonraki günlere katılamayanların yerine diğer başvuranlardan
talihliler seçilecek. O nedenle başvuru yapmaya isteyenler devam edebilir.
İlk günde yaptığımız birkaç minik örneğin kodlarını aşağıda sizlerle
paylaşıyorum. Son olarak buradan tekrar sevgili dostum Ercan Altuğ
Yılmaz'a ve NETRON ekibine teşekkür ediyorum. Örnek çalışmalara ait kaynak kodlar - 09032008_1.rar (15,12 KB)
Hatırlarsanız sizlere Microsoft Student2Business programı
kapsamında Microsoft İstanbul ofislerinde yaptığımız
eğitimden bahsetmiştim. Hatta sonrasında bir de söz konusu eğitimle ilgili
bir
video paylaşmıştım. İşte o eğitimdeki öğrencilerimden Özgür Arman
sözünü tuttu ve süper bir iş yaptı. Özgür özellikle oyun programlamaya olan
ilgisi ve konuya uzmanlık derecesinde
hakimiyetini (benim sohbetlerimdeki izlenimimle
sabittir) Silverlight dünyasına taşıdı.
http://www.ozgurarman.we.bs/SoloTest_4_0/index.html
Yukarıdaki adresten Özgür'ün hazırladığı Silverlight oyununu
inceleyebilirsiniz. Hepimizin çocukken epey oynadığı, taşları birbirinin
üzerinden atlatarak yediğimiz :D ve kalan taş sayısına göre genelde "aptal"
çıktığımız :) oyunu Özgür Silverlight ile sıfırdan geliştirdi. Oyunu görsel
anlamda incelerken bir yazılımcının elinden çıktığını aklınızda bulundurmakta
fayda var. :)
 Türkiye'de Silverlight 1.0 ile yapılmış ilk oyun!
Dikkat: Ekran görüntüsünden de görebileceğiniz üzere
Silverlight'ın Cross-Browser olmasından faydalanarak oyunumuzu Safari'de de
rahatlıkla çalıştırabiliyoruz.
Teşekkürler Özgür ;)
PCnet'in Mart sayısındaki yazılarımı her ay olduğu gibi yine buradan sizlere duyurmak
istiyorum :) Derginin
OKUL bölümünde AJAX, ASP.NET 3.5,
Expression Blend ve Silverlight ile ilgili yazılarım yer alıyor.
AJAX : İnce ayar AJAX.
Expression Blend : WPF tasarımında görsel kaynaklar
Silverlight: Silverlight projelerinin bileşenleri
ASP.NET 3.5 : ASP.NET 3.5 Veri Kontrolleri Hepinize sevgiler.
Uzun süredir planladığım WorkShop'lardan ilk seriyi sizlere duyuruyorum. Seminerlerden farklı olarak WorkShop'larda
herkes bilgisayar başında olacak. Toplam 24 saat olarak düşündüğüm bu eğitim
serisini INETA ve NETRON sponsorluğunda gerçekleştiriyoruz. Katılım
tamamen ücretsiz! Üç ayrı gün olarak
planladığımız eğitimin tarihleri, konuları, katılım formu aşağıdaki şekilde;
Buradan özellikle sevgili dostum E. Altuğ Yılmaz'a Netron'da sınıf
ayarlanabilmesi için yardımlarından dolayı teşekkür ediyorum.
 Silverlight Workshop serisi afişleri
Unutmadan, bu daha önce sizlere duyurduğum Netron'daki MS Web Designer
eğitiminin tanıtımı amacıyla yapılan bir şey değil. Zaten yukarıdaki tarihlerde
Nisan ayına kadar yaydığımı da görebilirsiniz. Bu benim müsait günlerime ait
plandan kaynaklanıyor. Yukarıdaki programda adam akıllı eğitim yapacağız.
Aslında bahsettiğim ücretli eğitimin sadece Silverlight kısmına rakip bile
görülebilir, tek farkı buradaki 24 saate karşılık o eğitimde 60 saat ve ek 20
saat de projeye ayrıca ayırabiliyor olmamız. Eh 80 saatlik işi burada 24 saatte
yapabiliriz dersem o da bariz yalan olur tabi :)
Tarihler uygun değil diyenlere yakında umarım farklı sürprizler de
yapabileceğim ;)
Silverlight uygulamalarında bazı durumlarda animasyonları dinamik olarak
yaratmak gerekebilir. Bu durum genelde söz konusu animasyonla ilgili bazı
değerlerin önceden bilinmemesinden kaynaklanır. Örneğin dinamik olarak
yarattığınız bir Silverlight nesnesine bağlı bir animasyon hazırlamak
isteyebilirsiniz, fakat hedef nesnenin özellikleri belli olmadığı için
animasyonu da yaratmanız mümkün olmayacaktır veya animasyonla ilgili bazı
değerleri AJAX ile sunucu tarafından alıyor olabilirsiniz. Bu gibi durumlarda
dinamik animasyon yaratabiliyor olmak hayati öneme sahip.
Silverlight içerisinde dinamik nesneler yaratırken createFromXaml adında bir
metod kullanıyoruz, aynı şekilde dinamil animasyonlar (Storyboard) yaratırken de
yine createFromXaml metodunu kullanıyor olacağız. createFromXaml metodu yapısı
gereği tek bir parametre alıyor, söz konusu parametre yaratılacak olan nesnenin
veya animasyonun XAML kodu. Animasyon tarafına tam olarak geçmeden önce gelin
aşağıdaki şekilde bir Silverlight projesi yaratalım.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="300"
Background="White"
x:Name="Page"
MouseLeftButtonDown="Tiklandi"
>
<Ellipse Width="45" Height="45" Fill="#FFFF0000" Canvas.Left="22" Canvas.Top="27"
x:Name="Top" RenderTransformOrigin="0.5,0.5">
<Ellipse.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Ellipse.RenderTransform>
</Ellipse>
</Canvas>
Yukarıdaki Silverlight uygulamamız içerisinde adını Top
koyduğumuz bir Ellipse nesnesi yer alıyor. Ayrıca Silverlight
uygulamamızın ana öğesi olan root Canvas'ın da
MouseLeftButtonDown durumuna bir event handler bağlamış durumdayız.
Birazdan Tiklandi adındaki JavaScript fonksiyonumuzu yazmaya
başlayacağız.
Uygulamamızda amacımız Silverlight içerisinde kullanıcı her nereye tıklarsa
tıklasın topun hoş bir animasyon ile o noktaya gitmesini sağlamak. Bunun için
tabi ki her animasyon (StoryBoard) nesneleri yaratmamız gerekecek fakat bu
animasyonların özellikleri şu anda belli değil çünkü kullanıcının sahnede nereye
tıklayacağını bilmiyoruz. O nedenle animasyonları dinamik olarak tıklama anında
yaratarak çalıştırmamız gerekecek. Yaratacağımız animasyonların şablonu
aşağıdaki gibi olmalı.
<Storyboard x:Name="Storyboard1">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Top" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:01"
Value="185"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Top" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
<SplineDoubleKeyFrame KeyTime="00:00:01"
Value="200"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
Yukarıdaki kod içerisinde Top nesnemizin sahnedeki yerini
değiştiriyoruz. Bu animasyonu hızlı bir şekilde Blend ile yaratarak örnek XAML
kodunu kopyaladık. Animasyon içerisinde özellikle koyu yazılan yerlerdeki
Value değerlerine dikkat etmekte fayda var. Bu değerlerin
Top'un gideceği hedef X ve Y koordinatları. Şimdi geçip yavaş
yavaş Tiklandi JavaScript fonksiyonumuzu yazmaya başlayalım.
function Tiklandi(sender, args)
{
var TiklananYer = args.getPosition(null);
var AnimXAML = '<Storyboard xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="Storyboard' + TiklananYer.X.toString() + TiklananYer.Y.toString() + '"><DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Top" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"><SplineDoubleKeyFrame KeyTime="00:00:01" Value="' + (TiklananYer.X - sender.findName("Top").width) + '"/></DoubleAnimationUsingKeyFrames><DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Top" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"><SplineDoubleKeyFrame KeyTime="00:00:01" Value="' + (TiklananYer.Y - sender.findName("Top").height) + '"/></DoubleAnimationUsingKeyFrames></Storyboard>';
var Anim = sender.getHost().content.createFromXaml(AnimXAML);
sender.resources.Add(Anim);
Anim.Begin();
}
Yukarıdaki fonksiyon istediğimiz işlemi tamamlamamız için yeterli. Gelin bu
fonksiyon içerisinde neler yaptığımıza bir bakalım. Birinci satırda hemen
TiklananYer adındaki bir değişkene fare ile tıklanan noktanın
koordinatlarını kaydediyoruz. Bunun için Tiklandi
fonksiyonumuza gelen ikinci parametre olan args üzerinden
getPosition metodunu kullanıyoruz. Bir sonraki adımda sıra
geldi yaratacağımız animasyonun XAML kodunu hazırlamaya.
AnimXAML adında bir değişkene Blend içerisinde
hazırladığımız XAML metnini aktarıyoruz. Fakat bunu yaparken metin içerisindeki
bazı şeyleri de JavaScript ile atamamız gerekiyor. Örneğin hem X hem de Y
yönünde gidilmesi hedeflenen noktanın koordinatlarını TiklananYer
değişkenimizden alarak XAML içerisine yerleştiriyoruz. Top nesnemizin tam olarak
tıklanan noktayı ortalayabilmesi için fareden gelen koordinatların topun
yüksekliğini veya genişliğini çıkartmayı da unutmamamız gerek. XAML kodu
içerisinde değiştirdiğimiz bir diğer özellik de StoryBoard
nesnesinin adı. Her tıklama işleminde yeni bir StoryBoard
yaratıp Silverlight animasyonumuza ekleyeceğimiz için farklı isimler vermemiz
gerekecek. Aynı isimde birden çok StoryBoard ekleyemeyiz. Bunun
için biz örneğimizde X ve Y koordinatlarını metin olarak StoryBoard
adının sonuna ekledik. Kullanıcının aynı noktaya tıklamayacağını ümit ediyoruz
:) İsterseniz siz söz konusu animasyonun var olup olmadığını kontrol ederek daha
sağlıklı bir işleyiş de sağlayabilirsiniz. Animasyon varsa yaratmadan doğrudan
çalıştırabilirsiniz.
createFromXaml metodu ile hazırlamış olduğumuz XAML kodundan
StoryBoard nesnemizi yarattırarak Anim adında
bir değişkene aktarıyoruz. Artık sıra geldi bu animasyonu Silverlight sayfamızın
kaynaklarına (resource) eklemek. O işlemi de tamamladıktan
sonra artık animasyonumuzu çalıştırabiliriz.
Uygulamayı çalıştırdığınızda Silverlight içerisinde nereye tıklarsanız
tıklayın topun son tıklanan yere doğru hareket ettiğini göreceksiniz. Eğer top
tıkladığınız noktaya ulaşmadan başka bir yere tıklarsanız yönünü değiştirerek
oraya doğru geldiğini de görebilirsiniz. Bunun nedeni böyle bir durumda iki
farklı animasyonun yaratılarak çalıştırılıyor olması. Son biten animasyon son
başlatılan olacağı için top en sonunda kendisini son tıklanan noktada
bulacaktır.
Hepinize kolay gelsin.
Silverlight uygulamalarında kullanıcı ile Silverlight nesneleri arasında bir
iletişim sağlayabilmek için fare tıklamalarını kullanmak gerçekten çok kolay. Bu
deneyimi bir üst adıma yükselterek sitemizin ziyaretçilerine Silverlight
uygulamalarında fareleriniz roller'larını kullanma şansı da tanıyabiliriz.
Aslında kullanacağımız teknik Silverlight 1.0'ın yapısı gereği istemci tarafında
JavaScript ile söz konusu durumları yakalayarak bunu Silverlight nesnelerine
yansıtmak olacak.
İlk olarak gelin Expression Blend 2 ile yeni bir Silverlight
projesi yaratalım ve tasarım kısmına bir Image nesnesi
yerleştirelim. Hedefimiz site ziyaretçisinin faresinin roller'ı ile bu resmi
büyütüp küçültebilmesi, bir anlamda Zoom yapabilmesi. Hazılardığımız XAML kodu
aşağıdaki şekilde olmalı. <Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480"
Background="White"
x:Name="Page"
>
<Image Width="352" Height="229" Canvas.Left="8" Canvas.Top="8"
Source="Autumn Leaves.jpg" RenderTransformOrigin="0,0">
<Image.RenderTransform>
<TransformGroup>
<ScaleTransform x:Name="Boyutlandir" ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
</Canvas>
Yukarıdaki XAML kodu içerisinde özellikle dikkat etmemiz gereken nokta
Image içerisindeki ScaleTransform tagının
programatik olarak ulaşılabilir bir adının olmasının şart olması. Biz
örneğimizde söz konusu taga Boyutlandir adını verdik. Böylece
bu nesneye ulaşarak ScaleX ve ScaleY
değerlerini programatik olarak değiştirerek resme zoom yapılmış gibi bir
ortamsağlayabileceğiz.
Bundan sonra tüm yapacaklarımızı projemizin Page.xaml.js
dosyası içerisinde yapacağız. İlk olarak bizim için otomatik olarak tanımlanmış
olan handleLoad fonksiyonu içerisine sayfa ilk açıldığında ve
Silverlight animasyonu yaratıldığında çalıştırılmak üzere aşağıdaki kodları
yazıyoruz.
if (window.addEventListener)
window.addEventListener('DOMMouseScroll',
ScrollOldu, false);
document.onmousewheel =
ScrollOldu;
window.onmousewheel = document.onmousewheel;
Yukarıdaki kodlarda aslında aynı işlemi birden çok farklı yöntem ile birçok
kes yapıyoruz. Bunun nedeni kodumuzun hem FireFox hem
Safari hem de Internet Explorer'da çalışmasını
sağlayabilmek. Yaptığımız şeyi kabaca tanımlamak gerekirse aslında tarayıcının
MouseScroll durumunu kendi tanımladığımız ScrollOldu
adında bir JavaScript fonksiyonun yönlendiriyoruz. Bir anlamda kendi "event
handler" yapımızı tanımlıyoruz.
Bir sonraki adımda artık yavaş yavaş ScrollOldu fonksiyonunu
yazmamız gerekiyor. Fakat bunun öncesinde birkaç ufak bilgiyi paylaşmak
istiyorum. ScrollOldu durumu birazdan göreceğimiz, kendisiyle
beraber gelen parametresinde scroll işleminin değerini getirir.
Bu değer farklı tarayıcılarda farklı şekillerde yakalanır. O nedenle biz de bir
çok kontrol yapıyor olacağız. Bahsettiğimiz değer aslında artı veya eksi bir
Integer
değeridir ve ne kadar scroll edilmesi gerektiğini tanımlar. Biz örneğimizde
sadece bu değerin + veya - olup olmadığını kontrol edeceğiz, scroll miktarı ile
zoom'u doğrudan eşleştirmeyeceğiz. Böylece farklı bilgisayarlarda scroll hızı
farklı ayarlanmış ise bu durum uygulamaya yansımayacak.
var ScrollMiktari = 0;
if (!event)
event = window.event;
if (event.wheelDelta)
{
ScrollMiktari = event.wheelDelta;
if (window.opera)
ScrollMiktari = -ScrollMiktari;
}
else if (event.detail)
ScrollMiktari = -event.detail;
Yukarıdaki kodumuz ScrollOldu fonksiyonumuzun baş kısmı.
ScrollOldu fonksiyonumuza gelen event adındaki
parametrenin tarayıcıya göre var olup olmamasına göre farklı eşleştirmeler
yapıyoruz. event nesnesinin yine tarayıcıya göre
wheelDelta özelliği var oradan gerekli değeri yakalıyoruz, yoksa bu
sefer detail özelliğinden değerimizi alıyoruz. Bazı
tarayıcılarda aşağıya doğru scroll + değer anlamına gelirken bazılarında tam
tersi olabiliyor. Tarayıcılar arası farkların detaylarına girmeyeceğim fakat
mantığı anlamakta fayda var.
Artık ScrollMiktari değişkenimize scroll
değerini aldıktan sonra gelen değerin pozitif veya negatif olmasına göre
Image nesnemizi boyutlandırmamız gerekiyor.
if (ScrollMiktari)
{
var Boyutlandir = document.getElementById("SilverlightControl").content.findName("Boyutlandir");
if (ScrollMiktari > 0)
{
Boyutlandir.ScaleX = Boyutlandir.ScaleX + 0.1;
Boyutlandir.ScaleY = Boyutlandir.ScaleX + 0.1;
}
else
{
Boyutlandir.ScaleX = Boyutlandir.ScaleY - 0.1;
Boyutlandir.ScaleY = Boyutlandir.ScaleY - 0.1;
}
}
Gördüğünüz gibi ilk başta sayfadaki Silverlight kontrolümüzü bularak
içerisinden Boyutlandir nesnemizi bir değişkene aktarıyoruz.
Sonrasında da ScrollMiktarı'nın durumuna göre Boyutlandir'in ScaleX
ve ScaleY değerlerini 0.1 artırıyor veya azaltıyoruz.
Son olarak yapmamız gereken işlem ise Silverlight uygulamamızın bulunduğu
sayfanın kendi içinde Scroll etmesini engellemek. Bunun için de fonksiyonumuzun
sonunda MouseScroll durumunu tarayıcının değerlendirmesini
sonlandırmak için olumsuz değerler geri döndürüyor olacağız.
if (event.preventDefault)
event.preventDefault();
event.returnValue = false;
Yazacağımız JavaScript kodları sonlandığında göre artık Page.xaml.js
dosyasının son halini inceleyebiliriz.
if (!window.UntitledProject1)
window.UntitledProject1 = {};
UntitledProject1.Page = function()
{
}
UntitledProject1.Page.prototype =
{
handleLoad: function(control, userContext, rootElement)
{
if (window.addEventListener)
window.addEventListener('DOMMouseScroll',
ScrollOldu, false);
document.onmousewheel =
ScrollOldu;
window.onmousewheel = document.onmousewheel;
}
}
function ScrollOldu(event)
{
var
ScrollMiktari = 0;
if (!event)
event = window.event;
if (event.wheelDelta)
{
ScrollMiktari = event.wheelDelta;
if (window.opera)
ScrollMiktari = -ScrollMiktari;
}
else if (event.detail)
ScrollMiktari = -event.detail;
if (ScrollMiktari)
{
var
Boyutlandir = document.getElementById("SilverlightControl").content.findName("Boyutlandir");
if (ScrollMiktari > 0)
{
Boyutlandir.ScaleX = Boyutlandir.ScaleX + 0.1;
Boyutlandir.ScaleY = Boyutlandir.ScaleX + 0.1;
}
else
{
Boyutlandir.ScaleX = Boyutlandir.ScaleY - 0.1;
Boyutlandir.ScaleY = Boyutlandir.ScaleY - 0.1;
}
}
if (event.preventDefault)
event.preventDefault();
event.returnValue = false;
}
Hepinize kolay gelsin.
Bundan bir süre önce Microsoft'un Students 2 Business
programı çerçevesinde
bir Silverlight eğitimi düzenlemiştik. Eğitim içerisinde bir ara sınıfı mini
bir stüdyoya çevirerek bir video kaydı da yapıldı :) Sonunda söz konusu video
kaydı Microsoft'un ücretsiz Silverlight Hosting hizmeti olan
Silverlight Streaming Services kullanılarak
S2B sitesinde
yayınlandı.
Video sınıftaki sıcaklığı pek yansıtamamış ama olsun :) Normalde çok daha
eğlenceli bir sınıftık.
Silverlight çıktığından bu yana özellikle yurt dışında bir çok ücretsiz ve
açık kaynak kodlu proje yayınlandı. Bunların arasında gerçek hayatta
kullanılabilirliği en yüksek olan proje
Slide.Show
projesi. Bu yazıda yukarıdan aşağıda Slide.Show'u inceleyerek
kurulumuna ve özelleştirilmesine değineceğiz.
Slide.Show paketini aşağıdaki adreste yer alan SlideShowSource linkine
tıklayarak bilgisayarınıza indirebilirsiniz.
http://www.codeplex.com/SlideShow/Release/ProjectReleases.aspx?ReleaseId=8862
Slide.Show paketini kullanmak üzere Expression Web ile "File
/ New / Web Site" menüsünden yeni bir web sitesi yaratalım. Yarattığımız web
sitesinde de boş bir HTML dosyası ekleyelim. Örneğimizde Slide.Show'u harici bir
XML dosyasına bağlayacağız. Bir sonraki adımda Slide.Show kontrolüne ait
Silverlight.js ve Slideshow.js dosyalarını projemize
eklememiz gerekiyor. Bunun için Expression Web içerisinde "File / Import / File"
menüsünden biraz önce indirmiş olduğumuz Slide.Show paketi içerisinde "Scripts/Release"
klasöründe yer alan iki JavaScript dosyasını seçiyoruz. Sıra geldi bu her iki
dosyayı da HTML sayfamıza linklemeye. Aşağıdaki şekilde bir kod ile o işlemi de
tamamlayabiliriz.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Daron Yöndem Photo Gallery</title>
<script
type="text/javascript"
src="Silverlight.js"></script>
<script
type="text/javascript"
src="SlideShow.js"></script>
</head>
<body>
</body>
</html>
Yapacağımız örnekte Slide.Show tüm sayfayı kaplayacağı için aşağıdaki şekilde
CSS tanımlamaları da yapmamız gerekecek.
<style type="text/css">
html,body,.SlideShow
{
height: 100%;
}
body
{
margin: 0px;
}
</style>
Son olarak Slide.Show kontrolünü sayfaya yerleştirmek üzere gerekli
JavaScript kodunu da yazarak sayfamızın HTML yapısını aşağıdaki şekilde
tamamlıyoruz.
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Daron Yöndem Photo Gallery</title>
<script type="text/javascript" src="Silverlight.js"></script>
<script type="text/javascript" src="SlideShow.js"></script>
<style type="text/css">
html,body,.SlideShow
{
height: 100%;
}
body
{
margin: 0px;
}
</style>
</head>
<body>
<script type="text/javascript">
new SlideShow.Control(new SlideShow.XmlConfigProvider());
</script>
</body>
</html>
Sıra geldi Silverlight.js ve Slideshow.js dosyamız ile aynı konumda bulunacak
olan ve uygulamamızla ilgili tüm ayarları içerek olan Configuration.xml
dosyasını düzenlemeye. Bunun için Expression Web içerisinde "File / New / XML"
komutunu kullanabilirsiniz. Yaratacağımız Slide.Show uygulamasında
kullanacağımız harici componentler de olacak. Söz konusu componentler Slide.Show
download paketi içerisinde Script/Debug klasöründe bulunuyor. Bu klasörde
bulunan tüm dosyaları kendi projemizde bir Scripts klasörü oluşturarak içerisine
kopyalayalım. Böylece Configuration.xml içerisinde bu dosyaları linkleyerek
uygulamamıza ek özellikler katabileceğiz.
<?xml version="1.0" encoding="utf-8" ?>
<configuration width="100%" height="100%">
<scripts>
<script key="AlbumViewer" url="Scripts/AlbumViewer.js" />
<script key="Button" url="Scripts/Button.js" />
<script key="DataProvider" url="Scripts/DataProvider.js" />
<script key="NavigationTray" url="Scripts/NavigationTray.js" />
<script key="ProgressIndicator" url="Scripts/ProgressIndicator.js" />
<script key="SlideDescription" url="Scripts/SlideDescription.js" />
<script key="SlideViewer" url="Scripts/SlideViewer.js" />
<script key="ThumbnailViewer" url="Scripts/ThumbnailViewer.js" />
<script key="Transition" url="Scripts/Transition.js" />
</scripts>
<modules>
<module type="SlideViewer" />
<module type="ProgressBar" />
<module type="SlideDescription" />
<module type="NavigationTray">
<option name="initialAlbumView" value="true" />
</module>
</modules>
<transitions>
<transition type="FadeTransition" name="CrossFadeTransition" />
<transition type="ShapeTransition" name="CircleOutTransition" />
<transition type="SlideTransition" name="SlideLeftTransition" />
<transition type="SlideTransition" name="SlideDownTransition">
<option name="direction" value="Down" />
</transition>
<transition type="WipeTransition" name="WipeRightTransition">
<option name="direction" value="Right" />
</transition>
</transitions>
<dataProvider type="XmlDataProvider" />
</configuration>
Yukarıda gördüğünüz Configuration dosyası içerisinde SlideShow uygulamamızda
kullanacağımız modülleri, script dosyalarını ve geçiş efektlerini belirliyoruz.
Son olarak sıra geldi Slide.Show içerisinde gösterilecek olan fotoğrafların bir
listesini ayrı bir XML dosyası içerisine yerleştirmeye. Bu noktada da data.xml
adında bir dosya yaratarak aşağıdaki şekilde albümler ve fotoğraflar
yaratabiliyoruz.
<data transition="CrossFadeTransition">
<album
title="Silverlight Trainings"
description="All around the world"
image="Images/a29.jpg">
<slide
title="Microsoft Turkey Silverlight Trainings"
description="Happy times."
image="Images/s07.jpg"
thumbnail="Images/t07.jpg" />
</album>
</data>
Yukarıdaki yapıyı takip ederek birden çok albüm ve her albüme birden çok
fotoğraf ekleyebilirsiniz. Albümlere ait kapak resmini Album
tagının içerisinde image özelliğine atarken her bir slayt için de Slide
tagına bir normal fotoğraf bir de thumbnail fotoğrafı
aktarmanız gerekiyor.
Tüm bu ayarları tamamladıktan sonra ayrı uygulamanızı internet üzerinden
yayınlayabilirsiniz.
Hepinize kolay gelsin.
Silverlight animasyonları içerisinde XAML ile tanımlanan tüm nesneleri
dinamik olarak kod ile de tanımlama şansımız var. Bu makalede Silverlight ile
dinamik içerik üretimine dair detaylardan bahsedeceğiz.
Silverlight içerisinde dinamik içerik üretebilmek için kullanacağımız
JavaScript metodu createFromXaml adında. Bu metod sadece tek
bir parametre alıyor, o da üreteceğimiz nesneye ait XAML kodunun ta kendisi.
İstediğimiz herhangi bir XAML kodunu createFromXaml metoduna
vererek geriye uygun bir JavaScript nesnesi alabiliyoruz. Gelin ufak bir örnek
ile konuya giriş yapalım. Aşağıda bir dikdörtgenin XAML kodu bulunuyor, aynı
dikdörtgeni JavaScript ile yaratacağız.
<Rectangle Width="100" Height="100" Fill="#FFFF0000" Canvas.Left="100" Canvas.Top="100"/>
Yukarıdaki dikdörtgenin aynısı JavaScript ile yaratabilmek için ilk
seçeneğimiz createFromXaml metoduna Rectangle tagını vererek dikdörtgenin
özelliklerini ayrı ayrı ayarlamak.
var Dikdortgen = control.content.createFromXaml("<Rectangle/>");
Dikdortgen.width = 100;
Dikdortgen.height = 100;
Dikdortgen["Canvas.Left"] = 100;
Dikdortgen["Canvas.Top"] = 100;
Dikdortgen.Fill = "#FFFF0000";
rootElement.children.add(Dikdortgen);
Yukarıdaki kodun ilk satırında createFromXaml metodu ile
dikdörtgenimizi yaratarak Dikdortgen adındaki bir değişkene
aktarıyoruz. Sonrasında da her satırda Dikdortgen değişkeni ile
ilgili bir özelliği ayarlıyoruz. En son satırda ise elde ettiğimiz
Dikdortgen nesnesini root Silverlight elementinin içine eklemek için
children.add metodunu kullanıyoruz. Bu şekli ile birden çok
dikdörtgeni farklı özellikler ile dinamik olarak Silverlight animasyonlarına
ekleyebilirsiniz.
Örneğimizde bahsi geçen dikdörtgen nesnesini dinamik olarak yaratmanın bir
diğer yolu da doğrudan tüm XAML kodunu createFromXaml metoduna
topluca vermek. Böylece tek tek dikdörtgenin özelliklerini sonradan ayarlamaya
ihtiyaç duymadan daha az kod ile sorunumuzu çözebiliriz.
var Dikdortgen = control.content.createFromXaml('<Rectangle Width="100" Height="100" Fill="#FFFF0000" Canvas.Left="100" Canvas.Top="100"/>');
rootElement.children.add(Dikdortgen);
Buraya kadar yaptığımız tüm örneklerde isimsiz nesneler kullandık.
Yarattığımız hiçbir dikdörtgenin özel bir ismi yok. Eğer bu dikdörtgenlere veya
yarattığınız farklı nesnelere sonradan programatik olarak ulaşabilmek isterseniz
baştan bu nesnelere birer isim vermiş olmak gerekecektir. Böyle bir durumda
dikdörtgenimizin kodu aşağıdaki şekilde olacaktır.
<Rectangle x:Name="KUTU" Width="100" Height="100" Fill="#FFFF0000" Canvas.Left="100" Canvas.Top="100"/>
İlk dikdörtgenimize ek olarak bu dikdörtgenin x:Name
şeklinde bir özelliği var ve söz konusu özelliğe KUTU değeri
aktarılmış. Böylece bu nesneye programatik olarak KUTU adı
üzerinden ulaşabileceğiz. Esas sorun yukarıdaki kodu createFromXaml
metoduna verdiğinizde karşınıza çıkacak. createFromXaml metodu
sürekli hata verecek ve maalesef verdiği hata mesajının da pek anlamlı olmaması
sizi çözüm yoluna yönlendirmeyecektir. Bu tarz bir durumda
createFromXaml'ın hata vermesinin aslında basit bir nedeni var.
x:Name olarak dikdörtgene verdiğimiz özellik aslında XML yazım
kuralları gereği ikinci bir namespace kullanıldığı anlamına geliyor. Söz konusu
namespace aslında her Silverlight XAML dosyasının roor (kök) elementinde tanımlı
durumda.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480"
Background="White"
x:Name="Page"
>
<Rectangle x:Name="KUTU" Width="100" Height="100" Fill="#FFFF0000" Canvas.Left="100" Canvas.Top="100"/>
</Canvas>
Yukarıdaki kod içerisinde kalın olarak yazılı kısımda bulabileceğiniz
namespace tanımları kök Canvas nesnesinde tanımlanmış
olduğu için tüm alt nesneler için de geçerli olacaktır. Oysa bizim
createFromXaml metoduna verdiğimiz XAML kodunda kullanılan x
namespace'inden createFromXaml metodunun haberi yok. Bu durumda
aynı namespace tanımlarını createFromXaml'a verdiğimiz kod
içerisinde de yapmak zorundayız.
var Dikdortgen = control.content.createFromXaml('<Rectangle xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="KUTU" Width="100" Height="100" Fill="#FFFF0000" Canvas.Left="100" Canvas.Top="100"/>');
rootElement.children.add(Dikdortgen);
Yukarıdaki kod içerisinde de gördüğünüz üzere artık createFromXaml
metoduna verdiğimiz XAML koduna gerekli namespace tanımlamalarını da ekledik.
Böylece herhangi bir hata ile karşılaşmadan istediğimiz isimlerde nesneler
yaratarak dinamik olarak animasyonlara ekleyebilir ve bu nesnelere sonradan
programatik olarak da ulaşabiliriz.
Hepinize kolay gelsin.
Silverlight animasyonları içerisindeki nesnelerin dinamik olarak kullanıcılar
tarafından boyutlandırılmasını sağlayabilirsiniz. Bunun için de tabi ki en hızlı
yol kullanıcıya fare ile herhangi bir nesneyi tutarak büyütüp küçültme şansı
tanımaktır. Bu makalemizde bu çeşit bir işlevselliği nasıl oluşturabileceğimizi
inceleyeceğiz.
Yeni bir Silverlight projesi oluşturarak sahneye deneme amaçlı olarak bir
Rectangle nesnesi yerleştirelim. Amacımız kullanıcıların bu
nesneye tıklayarak dikdörtgeni fare ile büyütüp küçültebilmelerini sağlamak.
Dikdörtgene tıkladıktan sonra fare ile nesneden uzaklaştıkça çizim büyüyecek,
nesnenin sol üst köşesine yaklaştıkça dikdörtgen küçülecek.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480"
Background="White"
x:Name="Page"
>
<Rectangle
MouseLeftButtonDown="FareGeldi"
MouseMove="FareHareketli"
MouseLeftButtonUp="FareGitti" Width="249" Height="237" Fill="#FFFF0000" Stroke="#FF000000" Canvas.Left="86" Canvas.Top="36"/>
</Canvas>
Yukarıdaki şekliyle Silverlifght animasyonumuzu hazırlıyoruz. XAML kodumuz
içerisinde bir dikdörtgen bulunuyor. Bu dikdörtgen yerine siz örneklerinizde
MediaElement gibi içerisinde video oynayan nesneler de
kullanabilirsiniz. Dikdörtgenimize tıklandığında büyüme ve küçülme işlemleri
olacağı için dikdörtgenin MouseLeftButtonDown,
MouseMove ve MouseLeftButtonUp durumlarına ayrı ayrı
JavaScript fonksiyonları yazmamız gerekiyor. Gelin tek tek bu fonksiyonları
yazmaya başlayalım.
var FareBasili;
var SonDurum = {};
function FareGeldi(sender,args)
{
sender.captureMouse();
FareBasili=true;
SonDurum = args.getPosition(null);
}
İlk olarak fareye ilk tıklandığında çalıştırılacak olan FareGeldi
fonksiyonunu yazıyor. Söz konusu fonksiyon içerisinde farenin durumunu global
olarak yakalayabilmemizi sağlayacakolan captureMouse metodunu
çağırdıktan sonra FareBasili adında düzenlemiş olduğumuz global
değişkenin değerini true olarak değiştiriyoruz. Böylece bir
sonraki adımda fare hareketini yakalarken büyütme işlemi başlatılmış mı yoksa
başlatılmamış mı kontrolünü yapabileceğiz. Son olarak da farenin sahnedeki
konumunu yine global değişkenimiz olan SonDurum değişkenine
aktarıyoruz.
function FareHareketli(sender,args)
{
if(FareBasili)
{
sender.width += args.getPosition(null).X -
SonDurum.X;
sender.height += args.getPosition(null).Y -
SonDurum.Y;
SonDurum = args.getPosition(null);
}
}
Dikdörtgen nesnesi üzerinde fare hareket ettikçe tetiklenecek olan
MouseMove durumuna bağlı FareHareketli fonksiyonu
içerisinde ilk olarak dikdörtgene basılarak herhangi bir büyütme veya küçültme
işleminin başlatılıp başlatılmadığı kontrol etmek için FareBasili
değişkeninin değerine bakıyoruz. Eğer öncesinde bir büyütme işlemi başlatılmış
ise gerekli değişiklikleri yapıyoruz. Farenin güncel konumu ile bir önceki
konumu arasında farkı alıp bu farkı nesnenin genişlik ve yükseklik değerlerine
ekliyoruz. Son olarak da farenin güncel konumunu tekrar global değişkenimize
kaydederek işlemi bitiyoruz. Böylece fare hareket ettikçe gerçekleşen konum
değişikliği kadar piksel değeri nesnenin boyutuna yansıtılacak.
function FareGitti(sender,args)
{
sender.releaseMouseCapture();
FareBasili = false;
}
Son olarak MouseLeftButtonUp durumunda çalışacak olan
FareGitti fonksiyonumuzu yazıyoruz. Bu fonksiyon kullanıcı
farenin düğmesinden parmağını çektiğinde çalışacak. Yani artık büyütme veya
küçültme işlemi sonlandı. Bu durumdan MouseMove event'ını
haberdar edebilmek için hemen global değişkenimizi false olarak değiştiriyoruz.
Artık örneğimiz çalışmaya hazır. Örneğin son halinin kaynak kodları şu
şekilde;
[Page.xaml.js]
if (!window.Resize)
window.Resize = {};
Resize.Page = function()
{
}
Resize.Page.prototype =
{
handleLoad: function(control, userContext, rootElement)
{
}
}
var FareBasili;
var SonDurum = {};
function FareGeldi(sender,args)
{
sender.captureMouse();
FareBasili=true;
SonDurum = args.getPosition(null);
}
function FareHareketli(sender,args)
{
if(FareBasili)
{
sender.width += args.getPosition(null).X - SonDurum.X;
sender.height += args.getPosition(null).Y - SonDurum.Y;
SonDurum = args.getPosition(null);
}
}
function FareGitti(sender,args)
{
sender.releaseMouseCapture();
FareBasili = false;
}
Hepinize kolay gelsin.
Silverlight içerisinde fare ile nesneler arasında bir etkileşim kurmak için
JavaScript ile çok farklı kodlar yazılabilir. Bu makalede herhangi bir nesneyi
fare ile tutarak sahnede kendi etrafında çevirmeyi deneyeceğiz. Bunun için hemen
yeni bir Silverlight animasyonu yaratıyoruz ve içerisinde örnek olması amacıyla
ufak bir resim yerleştiriyoruz. Image nesnesinin adını
Foto olarak verdikten sonra Image tagları arasına
aşağıdaki şekliyle RotateTransform nesnesi yerleştirmemiz
gerekiyor.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="400"
Background="White"
x:Name="Page"
>
<Image Width="185" Height="184" Canvas.Left="110" Canvas.Top="103" Source="image[1].jpg"
x:Name="Foto" RenderTransformOrigin="0.5,0.5">
<Image.RenderTransform>
<TransformGroup>
<RotateTransform
x:Name="FotoAci" Angle="0"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
</Canvas>
Yukarıdaki kod içerisinde özellikle dikkat etmemiz gereken iki nokta var.
Bunlardan ilki Image nesnemizin adının Foto
olması, ikincisi ise aynı şekilde Foto'ya ait RotateTransform
nesnesine de FotoAci ismini vermiş olmamış. Bu isimler
üzerinden söz konusu nesnelere ulaşıyor olacağız.
Kullanıcılar fotoğrafımıza tıklayarak döndürme işlemini başlatabilsinler.
Yani Foto nesnesinin MouseLeftButtonDown durumunu kontrol etmeliyiz. Aynı
şekilde döndürme işlemini bitirebilmek için MouseLeftButtonUp durumunu da
kontrol etmemiz gerekecek. Fakat bunların haricinde fare ile döndürme işlemi
yapılırken kullanıcı Foto nesnesinin dışına da çıkabilir. Bu durumda döndürmenin
devam edebilmesi için tüm sahnedeki MouseMouve durumunu kontrol etmemiz
gerekecek. Ayrıca döndürme işlemine fotoğrafın üzerinde başlayıp dışarıda
sonlandırılabilir. Özetle aşağıdaki şekilde dört farklı durumu kontrol etmemiz
gerekiyor.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="400"
Background="White"
x:Name="Page"
MouseMove="FareHareketli"
MouseLeftButtonUp="FareGitti"
>
<Image
MouseLeftButtonDown="FareGeldi"
MouseLeftButtonUp="FareGitti" Width="185" Height="184" Canvas.Left="110" Canvas.Top="103" Source="image[1].jpg" x:Name="Foto" RenderTransformOrigin="0.5,0.5">
<Image.RenderTransform>
<TransformGroup>
<RotateTransform x:Name="FotoAci" Angle="0"/>
</TransformGroup>
</Image.RenderTransform>
</Image>
</Canvas>
Şimdi sıra geldi gerekli JavaScript kodlarını yazmaya. Doğruda projemizin
Page.xaml.js dosyasına yöneliyoruz. İlk olarak
FareGeldi fonksiyonunu yazalım.
var FareBasili;
var SonDurum;
function FareGeldi(sender,
args)
{
//Global fare takibini başlat
sender.captureMouse();
//Tuşa BASILDI!! :)
FareBasili = true;
// Durumu bir kenara kaydet
SonDurum = args.getPosition(null);
}
Yukarıdaki kodun öncesinde iki adet global değişken tanımlıyoruz. Bu
değişkenlerden biri farenin tuşunun basılı olup olmadığı kontrol edecek. Böylece
MouseMove durumunda gerekli işlemlerin yapılıp, yapılmamasını
sağlayacağız. Diğer değişken ise fare imlecinin pozisyonunu bir kenara
kaydediyor, ileride kullanıyor olacağız.
Sıra geldi nesneyi çevirme işlemine, yani FareHareketli JavaScript
fonksiyonunu yazmaya.
function FareHareketli(sender,args)
{
var GuncelDurum = args.getPosition(null);
// Fareye basılı mı??
if (FareBasili)
{
var AciNesnesi = sender.findName("FotoAci");
// Nesnenin merkez noktasının global
//koordinatlarını bulalım.
var Merkez = {};
Merkez.X = sender.findName("Foto")["Canvas.Left"] + sender.findName("Foto").width/2;
Merkez.Y = sender.findName("Foto")["Canvas.Top"] + sender.findName("Foto").height/2;
// Çeviri işlemi
var SonAci = parseInt(Math.atan2(SonDurum.Y - Merkez.Y, SonDurum.X - Merkez.X) * 360 / (2 * Math.PI));
var GuncelAci = parseInt(Math.atan2(GuncelDurum.Y - Merkez.Y, GuncelDurum.X - Merkez.X) * 360 / (2 * Math.PI));
AciNesnesi.Angle += GuncelAci-SonAci;
// Son durumu tekrar sakla.
SonDurum = GuncelDurum;
}
}
Yukarıdaki kod sizi korkutmasın. Aslında epey basit bir işlemden
bahsediyoruz. İlk satırda farenin güncel koordinatlarını alıyoruz sonrasında da
fareye basılı mı yoksa değil mi kontrolünü yapmak için kendi FareBasili
değişkenimize danışıyoruz. Eğer farenin düğmesine basılmış ise döndürme işlemini
yapmamız gerekecek.
Döndürme işlemini yaptıktan sonra hesapladığımız yeni açı değerini adını
FotoAci koyduğumuz RotateTransform nesnesine aktarmamız gerekecek. O nedenle
baştan nesnemizi AciNesnesi adında bir değişkene aktarıyoruz.
Sıra geldi hesaplamalara; kullanacağımız teknik farenin sahnedeki konumu ile
çevirmek istediğimiz nesnenin merkez noktası arasında bir doğru çizerek bu
döğrunun X aksına açısını almak olacak. Bu nedenle ilk olarak nesnenin
merkezinin global koordinatlarını buluyoruz. Sonrasında açı hesaplama
işlemlerini yaparken ilk olarak bir önceki durumdaki, yani bizim
SonDurum değişkenine kaydettiğimiz durumdaki açıyı hesaplıyoruz sonra
da şu anki durumdaki açıyı hesaplıyoruz. Açı hesaplama için standart JavaScript
fonksiyonları kullanıyoruz. Kullandığımız esas fonksiyon olan Math.atan2 geriye
Radiant döndürdüğü için onu da dereceye çeviriyoruz.
Son olarak önceki ile sonraki açı arasındaki farkı alarak
RotateTransform nesnesinin açısına ekliyoruz. SonDurum
değişkenini de güncelledikten sonra işimiz bitiyor.
İşimiz bitiyor derken sadece FareHareketli fonksiyonundan
bahsediyordum. Tabi ki daha FareGitti fonksiyonunu da yazmamız
lazım.
function FareGitti(sender,args)
{
FareBasili = false;
sender.releaseMouseCapture();
}
Gördüğünüz gibi FareGitti kısmı belki de işin en kolay kısmı. Global
FareBasili değişkenimizi false yaptıktan sonra global
fare yakalamayı da kapatıyoruz.
Artık projemizi çalıştırabiliriz. Foto nesnemizi faremiz ile istediğimiz gibi
döndürebiliyoruz.
Hepinize kolay gelsin.
Bu makalemizde Silverlight ile bir EKG animasyonu yapacağız. Önce EKG
çizimimizi Expression Design ile yapmalıyız. Bunun için 300*200px yeni bir dosya
yaratarak "Pen Tool" ile sahneye bir doğru çizelim. Sonrasında
çizdiğimiz doğruya "Add Anchor Point" aracını kullanarak birkaç
nokta ekleyelim. Son olarak bu eklediğimiz noktalardan istediklerimizi "Direct
Selection Tool" ile seçerek yukarı veya aşağı sürükleyerek bir EKG
çizimi yaratabiliriz.
 Expression Design içerisinde EKG çizimimiz.
Çizimimiz tamamlandığında göre sıra geldi bu çizimi vektörel olarak
Expression Blend tarafına almaya. File / Export
menüsünden yola çıkarak Silverlight Canvas seçeneği üzerinden bir XAML çıktısı
alıyoruz. XAML dosyası içerisindeki Layer1 adındaki Canvas
elementini Blend içerisine kopyalayacağız. Tabi bunun için önce
Expression Blend 2 ile yeni bir Silverlight projesi yaratmamız
gerekiyor.
Expression Design'dan aldığımız XAML kodunu Blend 2 içerisine
yapıştırdığımızda Silverlight uygulamamızın XAML kodu aşağıdaki şekilde oluyor.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="200"
Background="White"
x:Name="Page"
>
<Canvas x:Name="Layer_1" Width="300" Height="200" Canvas.Left="0" Canvas.Top="0">
<Path Width="300.488" Height="194.519" Canvas.Left="-0.594986" Canvas.Top="5.19727" Stretch="Fill" StrokeThickness="2" StrokeLineJoin="Round" Stroke="#FF000000" Data="F1 M 0.405014,137.11L 30.6097,137.11L 42.6763,76.7877L 53.0284,146.736L 59.0672,127.484L 67.733,137.11L 153.962,137.11L 181.568,6.19727L 203.997,198.717L 223.839,65.2365L 241.092,151.87L 248.857,137.11L 298.893,137.11"/>
</Canvas>
</Canvas>
Kod içerisinde Path olarak gözüken kısım bizim çizimimiz ta kendisi.
Layer_1 adındaki Canvas da Expression Design tarafındaki Layer'ımız.
Şimdi sıra geldi ince ayarlar yapmaya. İlk olarak Silverlight animasyonunun
fonunu siyah yapalım, sonra da Path nesnemizin Stroke rengini parlak yeşile
çevirelim. Böylece koyu bir arkaplan üzerinde yeşil kalp atışları gözükecek.
Kalp atışlarının normal EKG gibi gözükmesi için bir maske kullanacağız. Maske
olarak kullanılmak üzere sahnenin kenarına ekranın dışına bir dikdörtgen
çizelim.
 Maskemiz kenarda bizi bekliyor.
Maskemizi çizdiğimize göre sıra geldi onu gerçekten Path'imize maske olarak
atamaya. Bunun için Expression Blend 2 içerisinde "Objects and Timeline"
panelinde hem Path'in içerisinde bulunduğu Canvas'ı hem de dikdörtgenimizi
seçerek sağ tuş ile tıklıyoruz. Gelen menüden "Path / Make Clipping Path"
komutunu vererek dikdörtgenin bir maske haline gelmesini sağlıyoryz.
 "Make Clipping Path" ile maskeleme.
Şimdi sora geldi gerekli animasyonu yaratmaya. Animasyonumuzda maske olarak
ayarladığımız dikdörgenin ekranın solundan sağına doğru dolaşması gerekiyor.
Bunun için yeni bir StoryBoard yaratalım. Sahne ilk açıldığında
animasyonun otomatik başlaması için "Create as a resource" seçeneğini deaktif
bırakalım.
Animasyonu maskemize vereceğimiz için bir şekilde maskemizi seçebiliyor
olmamız gerekir. Maskeleme yaptığınız herhangi bir nesneyi seçerek araç
çubuğundan "Direct Selection Tool"'u seçtiğinizde maskeye
müdahale edebildiğinizi göreceksiniz. Bu şekilde animasyonumuz içerisinde iki
farklı KeyFrame kaydederek maskeyi farklı konumlara getirebiliriz.
Artık animasyonumuz hazır. Son olarak StoryBoard'un RepeatBehavior
özelliğini de Forever yaparsanız sürekli tekrar edecektir.
Uygulamanın son haline ait XAML kodu aşağıdaki şekilde.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="200"
Background="#FF000000"
x:Name="Page"
>
<Canvas.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded">
<BeginStoryboard>
<Storyboard
RepeatBehavior="Forever" x:Name="Storyboard1">
<PointAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Layer_1" Storyboard.TargetProperty="(UIElement.Clip).(PathGeometry.Figures)[0].(PathFigure.StartPoint)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="-31.5,-28.5"/>
<SplinePointKeyFrame KeyTime="00:00:02" Value="308,-29.5"/>
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Layer_1" Storyboard.TargetProperty="(UIElement.Clip).(PathGeometry.Figures)[0].(PathFigure.Segments)[0].(LineSegment.Point)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="-9.5,-28.5"/>
<SplinePointKeyFrame KeyTime="00:00:02" Value="330,-29.5"/>
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Layer_1" Storyboard.TargetProperty="(UIElement.Clip).(PathGeometry.Figures)[0].(PathFigure.Segments)[1].(LineSegment.Point)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="-9.5,228.5"/>
<SplinePointKeyFrame KeyTime="00:00:02" Value="330,227.5"/>
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Layer_1" Storyboard.TargetProperty="(UIElement.Clip).(PathGeometry.Figures)[0].(PathFigure.Segments)[2].(LineSegment.Point)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="-31.5,228.5"/>
<SplinePointKeyFrame KeyTime="00:00:02" Value="308,227.5"/>
</PointAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>
<Canvas x:Name="Layer_1" Width="300" Height="200" Canvas.Left="0" Canvas.Top="0">
<Canvas.Clip>
<PathGeometry>
<PathFigure IsClosed="True" StartPoint="-31.5,-28.5">
<LineSegment Point="-9.5,-28.5"/>
<LineSegment Point="-9.5,228.5"/>
<LineSegment Point="-31.5,228.5"/>
</PathFigure>
</PathGeometry>
</Canvas.Clip>
<Path Width="300.488" Height="194.519" Canvas.Left="-0.594986" Canvas.Top="5.19727" Stretch="Fill" StrokeThickness="2" StrokeLineJoin="Round"
Stroke="#FF23FF00" Data="F1 M 0.405014,137.11L 30.6097,137.11L 42.6763,76.7877L 53.0284,146.736L 59.0672,127.484L 67.733,137.11L 153.962,137.11L 181.568,6.19727L 203.997,198.717L 223.839,65.2365L 241.092,151.87L 248.857,137.11L 298.893,137.11"/>
</Canvas>
</Canvas>
Hepinize kolay gelsin.
Silverlight uygulamaları içerisinde ister
sürükle&bırak sistemleri kullanın ister doğrudan InkPresenter
gibi fare imlecinin farklı anlamlar taşıdığı uygulamalara değinin yeri
geldiğinde farenin imlecini bir Silverlight nesnesi ile değiştirebiliyor olmak
gerçekten hoş olurdu. Bu yazıda bu yolda neler yapabileceğimize bakacağız.
İlk olarak Silverlight uygulamamızda imlecimizi oluşturacak olan nesneyi
oluşturalım. Bunun için ufak bir daire çizerek sahneye yerleştirelim.
<Canvas xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640"
Height="480"
Background="White"
x:Name="Page">
<Ellipse x:Name="Imlec"
Width="8"
Height="8"
Fill="#FFFF0000"
Stroke="#FF000000"
Canvas.Left="176"
Canvas.Top="231" />
</Canvas>
Gördüğünüz gibi yukarıdaki kodumuz içerisinde adını Imlec
olarak koymuş olduğumuz bir Ellipse nesnesi bulunuyor. Bu
nesnenin farenin esas imleci ile aynı konumda yer alması için Silverlight ana
Canvas'ımızın MouseMove durumunu kontrol ederek farenin
ekrandaki pozisyonunu alarak Imlec nesnemizin özelliklerine,
yani sahnedeki yerine yansıtacağız. MouseMove durumunu aşağıdaki gibi
tanımlayalım.
<Canvas xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640"
Height="480"
Background="White"
x:Name="Page"
MouseMove="FareSallandi">
<Ellipse x:Name="Imlec"
Width="8"
Height="8"
Fill="#FFFF0000"
Stroke="#FF000000"
Canvas.Left="176"
Canvas.Top="231" />
</Canvas>
Sıra geldi FareSallandi adındaki JavaScript fonksiyonunu
yazmaya.
function FareSallandi(sender, args)
{
//Farenin mevcut koordinatlarını değişkenlere alıyoruz.
var fareX = args.getPosition(null).x;
var fareY = args.getPosition(null).y;
// Imlec nesnemizin konumunu fareninkonumuna göre değiştiriyoruz.
sender.findName("Imlec")["Canvas.Left"] = fareX - (sender.findName("Imlec")["Width"] / 2);
sender.findName("Imlec")["Canvas.Top"] = fareY - (sender.findName("Imlec")["Height"] / 2);
}
Yukarıdaki kod içerisinde özellikle parametre olarak gelen args
deyimine dikkat etmekte fayda var. args parametresi üzerinde
getPosition metodu ile farenin pozisyonunu alabiliyoruz.
Aldığımız X ve Y poziyonlarını kendi değişkenlerimize kaydettikten sonra onları
Imlec nesnesinin Canvas.Left ve Canvas.Top
değerlerine aktarak Imlec'in fare imleci ile aynı konuma
gelmesini sağlıyoruz.
Koordinat bilgilerini Imlec nesnesine aktarırken imlecin
genişlik ve yüksekliğinin yarısını çıkartıyoruz, böylece Imlec
görseli tam olarak farenin tıklayacağı yeri ortalayabilecek. Aksi halde biraz
sağ altında kalacaktır.
Geriye tek bir sorun kalıyor; o da hala orijinal imlecin gözüküyor olması.
Imlecin Silverlight içerisinde görünmemesi için ana Canvas
nesnesinin Cursor özelliğini None olarak
ayarlıyoruz ve son olarak XAML kodumuz aşağıdaki gibi oluyor.
<Canvas xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640"
Height="480"
Background="White"
x:Name="Page"
MouseMove="FareSallandi"
Cursor="None">
<Ellipse x:Name="Imlec"
Width="8"
Height="8"
Fill="#FFFF0000"
Stroke="#FF000000"
Canvas.Left="176"
Canvas.Top="231" />
</Canvas>
Eğer isterseniz Imlec nesnesine bir de animasyon atayabilirsiniz. Söz konusu
animasyonu Expression Blend 2 içerisinde "Create as a resource" demeden
yaratırsanız Silverlight animasyonu sayfaya yüklendiği gibi başlayacaktır.
<Canvas xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640"
Height="480"
Background="White"
x:Name="Page"
MouseMove="FareSallandi"
Cursor="None">
<Canvas.Triggers>
<EventTrigger RoutedEvent="Canvas.Loaded">
<BeginStoryboard>
<Storyboard x:Name="FareAnim"
RepeatBehavior="Forever">
<ColorAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetName="Imlec"
Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)">
<SplineColorKeyFrame KeyTime="00:00:00"
Value="#FFFF0000" />
<SplineColorKeyFrame KeyTime="00:00:00.5000000"
Value="#FFFFFFFF" />
<SplineColorKeyFrame KeyTime="00:00:01"
Value="#FFFF0000" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Canvas.Triggers>
<Ellipse x:Name="Imlec"
Width="8"
Height="8"
Fill="#FFFF0000"
Stroke="#FF000000"
Canvas.Left="176"
Canvas.Top="231" />
</Canvas>
Animasyonun sürekli tekrar etmesi için RepeatBehavior
özelliğini Forever olarak ayarlayabilirsiniz. Böylece fare
imleci animasyonlu bir Ellipse olacaktır.
Hepinize kolay gelsin.
Visual Studio 2008 ipuçlarına bir tane daha ekliyorum.
Özellikle WPF veya Silverlight projeleri ile
ilgili çalışmalar yapıyorken XAML dosyalarının görsel panelinin de gösteriliyor
olması çoğu zaman can sıkıyor. Visua Studio görsel içerik hazırlama ortamı
değil, büyük ihtimal ile Visual Studio içerisinde bir XAML dosyası açıyorsanız
kod içerisinde elle müdahale yapmak istiyorsunuzdur.
Sözün özü; "Nasıl yaparız da Visual Studio'nun XAML dosyalarını otomatik
olarak sadece kod görünümünde açmasını sağlarız?"
Visual Studio içerisinde "Tools / Options" menüsüne giderek "Text Editor /
XAML / Miscellaneous" bölümünde aşağıdaki gibi bir ayarla karşılaşıyorsunuz.
 XAML dosyaları sadece kod görüntüsünde açılsın.
Bu ayarı işaretledikten sonra XAML dosyalarını açtığınızda doğrudan kod
görünümü gelecektir.
Hepinize kolay gelsin.
Bu makalemizde hızlı bir şekilde örnek bir Silverlight düğmesi tasarlayarak
fare ile üzerine gelindiğinde parlamasını üzerinden çekildiğinde de eski haline
geri dönmesini sağlayacağız. İlk olarak düğmemizi çizmek için Expression Blend 2
içerisinde yeni bir Silverlight projesi yaratalım ve Rectangle çizim aracı ile
bir dikdörtgen çizelim. Dikdörtgeni çizdikten sonra Expression Blend 2
içerisinde "Properties" tabından "Fill" kısmında SolidColor seçerek kırmızı
tonlarından biri seçebiliriz. Son olarak da dikdörtgenimizin kenarlarında
aşağıdaki fotoğraftaki gibi fare ile tutarak köşelerini yuvarlayalım.
 Silverlight düğmemizi yaratıyoruz.
Düğmemizi çizdiğimize göre parlama efekti için biraz değişiklik yapalım.
SolidColor yerine Gradient seçerek beyazdan
kırmızıya bir geçiş ayarlayarak Expression Blend 2 içerisinde sol araç
çubuğundan "Brush Transform" aracını kullanarak aşağıdaki şekilde bir parlama
efekti hazırlayalım.
 Parlama efekti hazır.
Sıra geldi fare ile üzerine geldiğimizde çalışacak olan animasyonu
hazırlamaya. Yapacağımız şey birer saniye arayla BrushTranform aracı ile parlama
efektinin yani Gradient'ın yönünü değiştirmek. Animasyonumuzu hazırladıktan
sonra düğmenin üzerinden fare ile çekildiğimizde çalıştırılmak üzere
animasyonumuzun bir kopyasını yaratacağız.
 Animasyonumuzun bir kopyasını alalım.
Animasyonumuzun kopyasını aldıktan sonra "geri çekilme" animasyonunu yaratmak
için bir önceki animasyondan aldığımız kopyayı tersine çevireceğiz. Bunun için
yukarıdaki görselde de görebileceğiniz Blend içerisinde animasyon menüsünden "Reverse"
komutunu kullanacağız. Böylece her iki animasyonumuz da hazır. Artık sıra geldi
her iki animasyonun da zamanında çalışmasını sağlayacak kodları yazmaya.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="300"
Background="White"
x:Name="Page"
>
<Canvas.Resources>
<Storyboard x:Name="Anim1">
<PointAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(Shape.Fill).(RadialGradientBrush.GradientOrigin)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="-0.071,-0.091"/>
<SplinePointKeyFrame KeyTime="00:00:01" Value="1.008,-0.061"/>
</PointAnimationUsingKeyFrames>
</Storyboard>
<Storyboard x:Name="Anim_Copy1">
<PointAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(Shape.Fill).(RadialGradientBrush.GradientOrigin)">
<SplinePointKeyFrame KeyTime="00:00:00" Value="1.008,-0.061"/>
<SplinePointKeyFrame KeyTime="00:00:01" Value="-0.071,-0.091"/>
</PointAnimationUsingKeyFrames>
</Storyboard>
</Canvas.Resources>
<Rectangle
MouseEnter="Geldi"
MouseLeave="Gitti" Width="127" Height="33" Stroke="#FF000000" Canvas.Left="62" Canvas.Top="163" RadiusY="10.5" RadiusX="10.5" RenderTransformOrigin="0.189,0.091" x:Name="rectangle">
<Rectangle.Fill>
<RadialGradientBrush GradientOrigin="1.008,-0.061">
<GradientStop Color="#FFFFFFFF" Offset="0"/>
<GradientStop Color="#FFFF0000" Offset="1"/>
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Canvas>
Yukarıdaki XAML kodunda hazırladığımız tüm animasyonlar ve düğmemiz yer
alıyor. Düğmemizin MouseEnter ve MouseLeave
durumları ayrı JavaScript fonksiyonlarına bağlanmış durumda. Aşağıda söz konusu
JavaScript fonksiyonlarını da inceleyebilirsiniz.
function Gitti(sender)
{
sender.findName("Anim1").Begin();
}
function Geldi(sender)
{
sender.findName("Anim_Copy1").Begin();
}
Her bir fonksiyon kendisine gönderilen Sender parametresi
üzerinden düğmemizi yakalayarak, onun üzerinden de findName ile
animasyonları bulup çalıştırıyor.
Böylece üzerine gelince veya fare ile üzerinden ayrıldığımızda uygun
animasyonları çalıştıran bir düğmemiz oldu. Hepimize hayırlı olsun ;)
Her Silverlight projesinde yer alan en önemli dosyalardan biri
Silverlight.js dosyasıdır. Bu dosya içerisinde özünde üç farklı
JavaScript fonksiyonu tanımlanmıştır. Bunlar createObject,
createObjectEx ve isInstalled
fonksiyonlarıdır. Bu fonksiyonlardan createObjectEx
yarattığımız her yeni Silverlight projesinde otomatik olarak kullanılan bir
fonksiyondur. Bu makalemiz boyunca bu fonksiyonlarla yapabileceklerimize ve
Silverlight.js dosyasının derinliklerine ineceğiz.
createObject ve createObjectEx Metodları
Her iki metod da aslında aynı işi yapıyor. Arada tek farkı
createObject metodu aldığı parametreleri tek tek alırken
createObjectEx metodu bir JSON dizisi olarak alıyor olması. Gelin
hızlıca aldıkları parametrelere ve anlamlarına bir göz atalım.
- Source: Silverlight animasyonuna yüklenecek olan XAML
kaynağına ait bir adres veya sayfa içi blok ID'si alabilir.
- Parent: Silverlight animasyonunun sayfada içerisine
yerleştirileceği HTML elementinin ID bilgisini alır.
- ID: Sayfadaki Silverlight animasyonunun adı olacak olan
ID bilgisini alır. Bu ID sayfadaki başka bir HTML elementi tarafından
kullanılmamış olmalıdır.
- Properties : Silverlight animasyonu ile ilgili
genişlik, yükseklik, fon rengi gibi özellikleri bir dizi olarak alır.
- Events: Silverlight animasyonu ilk yaratılırken
bağlanabilecek JavaScript durum fonksiyonlarının tanımlandığı yerdir.
Tanımlanabilen durumlar onLoad ve onError
durumlarıdır.
- initParam: Kullanıcı tarafından gerektiğinde tanımlanan
parametrelerdir.
- Context: Kullanıcı tarafından gerektiğinde
aktarılabilen ve onLoad duruma aktarılacak olan bir parametredir.
Silverlight.createObjectEx({
source: "Page.xaml",
parentElement: document.getElementById("silverlightControlHost"),
id: "SilverlightControl",
properties: {
width: "100%",
height: "100%",
version: "1.0"
},
events: {
onLoad: Silverlight.createDelegate(scene, scene.handleLoad)
}
} createObjectEx Metodu kullanım örneği.
Silverlight.createObject(
"Page.xaml",
document.getElementById("silverlightControlHost"),
"SilverlightControl",
{
width: "100%",
height: "100%",
version: "1.0"
},
{
onLoad: Silverlight.createDelegate(scene, scene.handleLoad)
}
} createObject Metodu kullanım örneği.
Yukarıda iki metod arasındaki kullanım farkını daha net bir şekilde
görebilirsiniz. Her iki metod içerisinde de Properties listesi
bir JSON listesi olarak aktarılıyor. Şimdi gelelin bu liste içerisinde neleri
tanımlayabiliyor olduğumuza.
- Width: Silverlight nesnesinin genişliğini belirler.
Sabit bir piksel değeri olabileceği gibi bir yüzde değeri de içerebilir.
- Height: Silverlight nesnesinin yüksekliğini belirler.
Sabit bir piksel değeri olabileceği gibi bir yüzde değeri de içerebilir.
- background: Silverlight nesnesinin fon rengini
belirler. Varsayılan değeri null şeklindedir ve bu durum fon renginin beyaz
olmasına neden olur.
- isWindowless: Silverlight nesnesinin sayfa içerisinde
nesnelerden bağımsız olarak yerleştirilebilmesini sağlar. True
değeri aktarıldığında nesnenin background değeri artık şeffaflık da
içerebilir. Silverlight animasyonu önüne HTML kontrollerini overlay
koyabilmek için de bu teknik kullanılır.
- frameRate: Silverlight nesnesinin maksimum
gösterebileceği saniyede kare sayısını sınırlar. Desteklenen en yüksek sayı
64 şeklindedir. Varsayılan değer 24'tür.
- inplaceInstallPrompt: Değeri true
olduğunda standart Silverlight yükleme görseli yerine kullanıcı sözleşmesine
de link içeren bir görsel kullanılır. Böylece kullanıcı Microsoft web
sitesine yönlenmeden doğrudan Plug-In'i yüklemeye başlayabilir.
- version: Silverlight animasyonunun çalıştırılabilmesi
için istemcide yüklü olması gereken minimum Silverlight Plug-In sürümünü
belirler.
- ignoreBrowserVer: Silverlight animasyonu yüklenmeden
önce tarayıcının Silverlight destekleyip desteklemediğinin kontrol
edilmemesini sağlar. Varsayılan değeri false şeklindedir.
- enableHtmlAccess: Silverlight animasyonu içerisindeki
nesnelerin animasyon dışındaki sayfadaki HTML elementlerine ulaşıp
ulaşamayacağını belirler. Varsayılan değeri true
şeklindedir.
isInstalled
Otomatik kontrol işlemlerinin yanı sıra isterseniz kendi kontrol kodunuzu
yazarak Silverlight.js içerisindeki isInstalled
metodunu da kullanabilirsiniz. Böylece istemci tarafında hangi Silverlight Plug-In'in
yüklü olduğunu görebilirsiniz.
if(Silverlight.isInstalled("1.0"))
{
createSilverlight();
}
else
{
alert("AMAN TANRIM! Silverlight yüklü değil!!");
}
Yukarıda gördüğünüz kod ile Silverlight Plug-In'in 1.0 sürümünün yüklü olup
olmadığı kontrol ediyoruz. Eğer yüklü değilse uygun bir uyarı mesajı :)
gösteriyoruz. Farklı senaryolarda bu noktada kullanıcıya farklı görsel uyarılar
gösterilebilir.
Silverlight.js tarafında detaylar bu kadar. Hepinize kolay gelsin.
Bugün Microsoft İstanbul ofislerinde bir başka iş ortakları
eğitimini daha bitirdik. Silverlight, WPF ve AJAX
konularına değindiğim eğitimde yaptığım bazı demoların kodlarını aşağıda hem
blog okuyucularım hem de eğitime katılan öğrencilerimle paylaşıyorum. Peki neden
bazılarını? :)
Örnekleri kendime saklama gibi bir çekincem yok, bende örnek bol :) Her gün
bir yenisini müşterilere yapıyoruz zaten. Genelde kodları bloga koyamıyor
olmamın nedeni tüm örnekleri eğitimlerimde sürekli sıfırdan yapıyor olmam.
Bugüne kadar hiçbir eğitimime hazır kod ile veya örnek ile girmedim ve bu durum
hiçbir zaman da "hazırlıksız gelmiş" olma gibi bir sıkıntı yaratmadı.
Şükür ki eğitimini verdiğim her şeyi zaten her gün 24 saat kullanıyorum :) Durum
böyle olunca örnek oluşturma sorunu da olmuyor. Diğer yandan örnekleri canlı
canlı yapıyor olmanın bir diğer avantajı da olası "hatalarla" öğrencilerle
beraber karşılaşıyor olup, çözebiliyor olmak. Böylece belki de "eve giden
öğrencinin karşılaşacağı ilk hatayı" biz çoktan sınıfta işlemiş oluyoruz :)
Sonuçta sınıfta yapılan demoların kodları çoğu zaman "zaman kaybetmemek"
adına sadece konsepti gösteren örnekler oluyor. Örneğin bir WPF eğitiminde
SQL'den data çekmeyle uğraşmak yerine doğrudan dummy data yaratabiliyorum kod
ile. Zaten katılımcılar da SQL'den data çekmeyi zaten biliyor :) Bunun gibi
sadece bahsi geçen eğitimin katılımcılarına özel olarak eksikler içeren
örnekleri buradan paylaşmayı doğru bulmuyorum.
Neyse, yine çok uzattım. Şimdilik paylaşabileceğim örnek kodlar aşağıda ;)
Silverlight ve WPF Örnek Kodları - 07022008_2.rar (138,72 KB)
Eğitime katılan herkese ve özellikle eğitim sonundaki pozitif olduğu kadar da
samimi yorumlara çok teşekkürler.
Bir Silverlight projesi farklı dosyalardan ve yapılardan oluşur. Bu yapılar
neredeyse tamamı ister Visual Studio içerisinde ister
Expression Blend 2 içerisinde bir Silverlight projesi yarattığınızda
otomatik olarak oluşturularak karşınıza çıkar. Her şey ne kadar otomatik olsa da
belirli noktalarda işlemlere müdahale edebilmek açısından bizim için otomatik
olarak hazırlanan şeylerin neler olduğunu biliyor olmak önemlidir. Bu yazımızda
bir Silverlight projesinin doğumundan bahsedeceğiz.
İlk olarak Expression Blend 2 içerisinde yeni bir Silverlight Web Site
yaratalım ve bakalım "Project Explorer" içerisinde neler var.
 Expression Blend 2 içerisinde Silverlight projesindeki dosyalar.
Gördüğünüz üzere bizim için yaratılmış olan birden çok dosya bulunuyor. İlk
olarak gelin default.html dosyasından başlayalım.
default.html
Herhangi bir Silverlight animasyonu tek başına çalışma yetisine sahip
değildir. Silverlight nesnelerinin bir şekilde bir web sayfası içerisinde
sunuluyor olması gerekir. Bu nedenle bizim projemizde de Expression Blend 2
bizim için otomatik olarak bir HTML dosyası yaratarak söz konusu HTML dosyası
içerisinde Silverlight animasyonumuzu yerleştirmiş durumda. Bu HTML dosyasının
içeriğine baktığımızda ilginç yapılarla karşılaşıyoruz. <script type="text/javascript" src="Silverlight.js"></script>
<script type="text/javascript" src="Default_html.js"></script>
<script type="text/javascript" src="Page.xaml.js"></script>
İlk dikkatimizi çeken yukarıdaki şekli ile üç farklı JavaScript dosyasının
sayfaya eklenmiş olması. Bu dosyaların ne işlemler yaptığına birazdan sırası ile
göz atacağız. HTML sayfamızı incelemeye devam edelim.
<style type="text/css">
#silverlightControlHost {
height: 480px;
width: 640px;
}
#errorLocation {
font-size: small;
color: Gray;
}
</style>
Sayfa içerisinde yukarıdaki gördüğünüz gibi CSS sınıfları yer alıyor. Bu
sınıflar # deyimi ile tanımlandığı için sayfada kendi adlarındaki HTML
elementlerini bularak onları etkileyeceklerdir. SilverlightControlHost
adındaki element birazdan kodunu göreceğimiz ve içerisinde Silverlight
animasyonunu barındıracak olana DIV elementinin ta kendisi. Bu elementin
yükseklik ve genişliğini buradan tanımlayarak aslında Silverlight animasyonunun
genel yükseklik ve genişliğini de tanımlamış oluyoruz. Bu genişlik ve yükseklik
tanımlama işlemi için aslında faydalanabileceğimiz başka bir yer daha var. Ondan
da ileriki adımlara bahsedeceğiz. Konuyu CSS kullanmadan çözmek de mümkün.
Diğer CSS sınıfı olan errorLocation ise yine sayfada
errorLocation adındaki DIV elementini etkileyecek. Bu element
Silverlight animasyonunda herhangi bir hata olursa söz konusu hataya ait mesajın
gösterileceği elementin ta kendisi.
<div id="silverlightControlHost">
<script type="text/javascript">
createSilverlight();
</script>
</div>
<!-- Runtime errors from Silverlight will be displayed here.
This will contain debugging information and should be removed or hidden when debugging is completed -->
<div id='errorLocation'></div>
Bir önceki adımda incelediğimiz ve detaylarından bahsettiğimiz CSS sınıfları
yukarıdaki DIV elementlerini etkiliyorlar. Bu elementlerden özellikle
SilverlightControlhost elementi çok önemli. Bu element içerisinde
Silverlight animasyonumuz yerleştiriliyor olacak. Yerleştirme işlemini yapan
JavaScript fonksiyonu da createSilverlight fonksiyonu.
createSilverlight fonksiyonu sayfada herhangi bir yerde olabilir veya
herhangi bir şekilde çalıştırılabilir.
Şimdi gelelim sırasıyla sayfamıza linklenmiş olan JavaScript dosyalarının ne
işe yaradığına.
Silverlight.js
Silverlight JavaScript dosyası sayfanın en üstünde yer almalıdır. Bu dosya
içerisindeki kodlar istemci tarafında Silverlight Plug-In'in yüklü olup olmadığı
kontrol ederek gerekli mesajların, görsel uyarıların gösterilmesini
sağlayacaktır. Eğer bu görsel uyarıları bir şekilde değiştirmek istiyorsanız
Silverlight.js dosyası doğru hedeftir.
Default_html.js
Bu dosya içerisinde aslında tek bir JavaScript fonksiyonu bulunuyor;
createSilverlight. Hatırlarsanız bu fonksiyon bizim HTML dosyamızda
sayfaya Silverlight animasyonumuzu yüklemek için kullandığımız fonksiyondu. Söz
konusu fonksiyon doğrudan Default_html.js içerisinde tanımlanıyor.
var scene = new UntitledProject9.Page();
Silverlight.createObjectEx({
source: "Page.xaml",
//Silverlight animasyonu için yüklenecek olan XAML kaynağı.
parentElement: document.getElementById("silverlightControlHost"),
//Animasyonun yerleştirileceği HTML elementinin ID bilgisi.
id: "SilverlightControl",
//Animasyona verilen ID bilgisi.
properties: {
width: "100%",
height: "100%",
version: "1.0"
},
Yukarıdaki kod createSilverlight fonksiyonunun sadece bir parçası.
Silverlight nesnemiz yaratılırken tabi ki bazı parametrelerin verilmesi
gerekiyor. Bu parametreleri olabildiğince yukarıdaki kod içerisinde satır
aralarında anlatmaya çalıştım. Silverlight animasyonumuzda kullanılacak olan
kaynak XAML kodunun geleceği adresten tutun, animasyonun sayfada yükleneceği
konumun HTML elementine ait ID bilgisine kadar herşey burada belirleniyor.
Özellikle Silverlight animasyonuna da bu noktada bir ID bilgisi verildiğini
atlamamak gerek. Silverlight uygulamasının programlanması noktasında bu ID
bilgisi üzerinden Silverlight nesnesine ulaşılacaktır.
Son olarak animasyon alanının toplam genişlik ve yüksekliğinin buradan da
ayarlandığını bilmekte fayda var. Varsayılan hali ile yaratılan projelerde
genişlik ve yükseklik ayarları CSS ile düzenlenmiş durumda. Oysa burada da
gerekli ayarlar yapılarak herhangi bir CSS kullanmadan da ilerlenebilir.
Version bilgisi altında şu an için 1.0 bulunuyor. İleride Silverlight'ın
farklı sürümleri de yayınlandığında bu noktadaki bilgiye uygun işlemler Plug-In
tarafından yapılacaktır. events: {
onLoad: Silverlight.createDelegate(scene, scene.handleLoad),
onError: function(sender, args) {
var errorDiv =
document.getElementById("errorLocation");
if (errorDiv != null) {
var errorText = args.errorType + "- " + args.errorMessage;
if (args.ErrorType == "ParserError") {
errorText += "<br>File: " + args.xamlFile;
errorText += ", line " + args.lineNumber;
errorText += " character " + args.charPosition;
}
else if (args.ErrorType == "RuntimeError") {
errorText += "<br>line " + args.lineNumber;
errorText += " character " + args.charPosition;
}
errorDiv.innerHTML = errorText;
}
Yukarıdaki kod içerisinde aslında iki işlem yapılıyor. Bu işlemlerden ilki
Silverlight animasyonunun yüklenmesi yani onLoad durumunda
çalıştırılmak üzere bir JavaScript metodunun aktarılması. Söz konusu bu metodu
başka bir dosya içerisinde yazıyor olacağız. İkincisi ise onError
yani Silverlight animasyonu içerisinde herhangi bir hata olursa çalıştırılacak
olan JavaScript fonksiyonunun hazırlanması. Bu fonksiyon doğrudan kod içerisinde
yazılmış. Şu andaki kod hatanın mesajını alarak errorDiv
adındaki bir HTML elementinin içerisine yerleştiriyor. Söz konusu element de
errorLocation adındaki HTML elementinden yakalanıyor.
errorLocation elementini HTML dosyamızın içerisinden hatırlıyoruz.
Page.xaml.js
Son olarak sıra geldi esas Silverlight JavaScript kodlarımızı yazacağımız
Page.xaml.js dosyamıza. Bu dosyayı kabaca bir code-behind dosyası olarak kabul
edebilirsiniz. Dosya içerisinde bizim için yazılmış olan örnek kodlar bulunuyor.
handleLoad: function(control, userContext, rootElement)
{
this.control = control;
// Sample event hookup:
rootElement.addEventListener("MouseLeftButtonDown", Silverlight.createDelegate(this, this.handleMouseDown));
},
Bu dosya içerisinde özellikle handLoad JavaScript
fonksiyonundan bahsetmek istiyorum, çünkü bu fonksiyon bir önceki adımda
default_html.js içerisinde Silverlight animasyonunun onLoad
durumuna bağlanmıştı. Söz konusu fonksiyon HTML sayfası açıldıktan ve
createSilverlight fonksiyonu çalıştırıldıktan sonra hemen çalışacaktır.
Yani Silverlight animasyonun yüklenmesinden sonra yapmak isteyeceklerinizi hemen
burada yazabilirsiniz. handlLoad içerisindeki örnek kodları da gönül rahatlığı
ile silebilirsiniz.
Böylece yeni başlayan bir Silverlight projesindeki dosyaları ve neyin nasıl
çalıştığını incelemiş olduk.
Hepinize kolay gelsin.
İster Silverlight uygulamaları olsun ister WPF uygulamaları, her şekilde XAML
kodları içerisindeki Brush (fırça) tanımlamaları görsel anlamda çok önemlidir.
Herhangi bir nesnenin içerisini boyamaktan tutan resim ile doldurmaya kadar çoğu
noktada Brush yapıları kullanılır.
Bu makalemizde Silverlight içerisinde kullanabileceğimiz
Brush
yapılarını ufak örneklerle inceleyeceğiz. Makale boyunca bahsi geçen tüm
işlemleri bir "yazılımcı" perspektifi ile değerlendireceğim, o nedenle XAML
kodlarını yazmak için Visual Studio kullanacağız. Tasarımcı arkadaşların
Expression Blend dünyasında daha farklı araçları ve olanakları
olacaktır.
SolidColorBrush
Herhangi bir nesnenin için tek bir renk ile doldurmak istiyorsanız veya
herhangi bir alana tek bir renk atamak istiyorsanız yapmanız gereken bir
SolidColorBrush kullanmaktır.
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas Width="120" Height="44">
<Ellipse Width="500" Height="500">
<Ellipse.Fill>
<SolidColorBrush
Color="Black"></SolidColorBrush>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Canvas>
Örneğimizde bir Silverlight animasyonu içerisinde yer alan Ellipse nesnenin
içerisini tek bir renk ile doldurmak için uygun bir SolidColorBrush
kullanıyoruz. Söz konusu Brush'ın rengini ayarlamak için Color
özelliğinden faydalanmamız gerekiyor. Herhangi bir SolidColorBrush'ın
Color özelliğine doğrudan bir renk adı verebileceğiniz gibi
toplam 8 karakterden oluşan Hexadecimal bir değer de aktarabilirsiniz. #AARRGGBB
şeklinde formatlı olan renk değerinin AA kısımlarına Alpha
(şeffaflık), RR (Red / Kırmızı), GG (Green /
Yeşil), BB (Blue / Mavi) renk değerleri aktarılır.
LinearGradientBrush
Gradient yapısını az çok çoğu programdan biliyoruz, belirli bir renkten başka
bir renge doğru geçişlerin yapıldığı boyama şekline Gradient deniyor. Bu şekilde
bir boyamayı Silverlight içerisinde yapabilmemiz için GradientBrush yapılarından
birini kullanmanız gerekir. Bu çerçevede LinearGradientBrush
doğrusal olarak renkler arası geçişlerin yapıldığı bir boyama işlemine olanak
tanır.
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas Width="120" Height="44">
<Ellipse Width="200" Height="200">
<Ellipse.Fill>
<LinearGradientBrush>
<GradientStop
Color="Yellow"
Offset="0"/>
<GradientStop
Color="Black"
Offset="0.7"/>
<GradientStop
Color="Yellow"
Offset="1"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Canvas>
LinearGradientBrush yapıları içerisinde birbirinden bağımsız GradientStop'lar
kullanılır. Her bir GradientStop renk geçişinin tamamlanacağı
noktayı ve o noktadaki rengi belirler. Bizim örneğimizde sarıdan siyaha ve
sonrasında tekrar siyahtan sarıya doğru bir geçiş olacak. Bu doğrusal geçiş
boyunca geçişlerin tam olarak hangi noktalarda yapılacağına da her bir
GradientStop'ın Offset değeri karar verir. 0 ile 1
arasında tüm geçiş doğrusu üzerinde belirlenen konuma göre
GradientStop'lar yerleştirilir. Yukarıdaki kodun oluşturduğu görseli
aşağıda inceleyebilirsiniz.
 LinearGradientBrush çizimi.
Yukarıdaki resimde de gördüğünüz gibi LinearGradientBrush yapısı sol üst
köşeden başlayarak sağ alt köşeye doğru ilerler. Bu doğrunun yönünü değiştirmek
için LinearGradientBrush'ların StartPoint ve EndPoint
özelliklerinden faydalanabiliriz. Bu özelliklerin her ikisi de
LinearGradientBrush doğrusunun başlangıç ve son noktalarının X ve Y
koordinatlarını içerir. Söz konusu koordinatlar 1 ile 0 arasında verilerek
nesnenin en üst sol noktası 0,0 (origin) olarak kabul edilir. Gerektiğinde bu
değerler eksi veya artı olarak 0'dan küçük veya 1'den büyük de olabilir. Bu gibi
durumlarda Gradient doğrusunun nesne sınırlarının dışarısında başlayacağı veya
biteceği öngörülür.
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas Width="120" Height="44">
<Ellipse Width="200" Height="200">
<Ellipse.Fill>
<LinearGradientBrush
StartPoint="0,0"
EndPoint="0,1">
<GradientStop Color="Yellow" Offset="0"/>
<GradientStop Color="Black" Offset="0.7"/>
<GradientStop Color="Yellow" Offset="1"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Canvas>
Yukarıdaki kod içerisinde tanımlanan LinearGradientBrush'ın başlangıç noktası
0,0 ve sonlanma noktası da 0,1 olarak verilmiş. Başlangıç ve bitiş noktalarının
sadece Y koordinatları değiştirilmiş ve bitiş noktası nesnenin sol altına denk
getirilmiş. Aldığımız görsel sonuç aşağıdaki gibi olacaktır.
 LinearGradientBrush yönündeki değişiklik.
RadialGradientBrush
LinearGradientBrush'ların tüm özelliklerine sahip olan
RadialGradientBrush'ların tek farkı doğrusal bir renk değişimi sağlamak yerine
dairesel bir renk değişimi sağlamalarıdır.
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas Width="120" Height="44">
<Ellipse Width="200" Height="200">
<Ellipse.Fill>
<RadialGradientBrush>
<GradientStop
Color="Yellow"
Offset="0"/>
<GradientStop
Color="Black"
Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Canvas>
Yukarıda gördüğünüz yapıda LinearGradientBrush'lara kıyasla tek fark
Brush'ımız kendi adı. Aldığımız görsel sonuç ise aşağıdaki şekilde.
 RadialGradientBrush çizimi.
RadialGradientBrush'ların merkez noktasını değiştirerek farklı görsel
efektler oluşturmak mümkün. Bunun için GradientOrigin denen
özellikten faydalanacağız ve söz konusu özelliğe merkez noktası için X ve Y
koordinatları aktaracağız. Bu koordinatların da 1 ile 0 arasında olması
gerekiyor, aksi halde merkez nokta nesnenin dışına çıkacaktır.
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas Width="120" Height="44">
<Ellipse Width="200" Height="200">
<Ellipse.Fill>
<RadialGradientBrush
GradientOrigin="0,0">
<GradientStop Color="Yellow" Offset="0"/>
<GradientStop Color="Black" Offset="1"/>
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Canvas>
Aldığımız görsel sonuç gerçekten etkileyici. Özellikle bir Ellipse
kullanmış olmamız RadialGradientBrush'ın ışık etkisi
yaratmasına neden oldu.
 Origin'i değiştirilmiş RadialGradientBrush.
ImageBrush
Nesnelerin içlerini resimlerle doldurmak için kullanacağınız fırça (Brush)
yapısının adı ImageBrush olarak geçiyor.
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas Width="120" Height="44">
<Ellipse Width="200" Height="200">
<Ellipse.Fill>
<ImageBrush
ImageSource="kaplumbaga.jpg"></ImageBrush>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Canvas>
Kodumuzda da gördüğünüz üzere Ellipse'imizin Fill özelliğine bir
ImageBrush aktarıyoruz. Söz konusu ImageBrush resim kaynağını
ImageSource özelliği ile alıyor. Böylece elde ettiğimiz görüntü
aşağıdaki şekilde oluyor.
 ImageBrush ile gelen kaplumbağamız :)
ImageBrush'a özel olarak bahsedebileceğimiz bir durum kaynak resmin hedef
alana yerleştirilirken en-boy oranına göre ne tarz bir konumlandırma
yapılacağıdır. Bu konuyla ilgili ImageBrush'ın Stretch
özelliğinden faydalanıyoruz.
- Fill : Resmin en-boy oranı korunmadan hedef alan
doldurulur.
- Uniform : Resmin en boy oranı korunarak olabilen en
büyük boyutta yerleştirilir.
- UniformToFill: Resmin en-boy oranı korunarak hedef alan
tamamen doldurulur. Bu işlemin gerçekleşebilmesi için resmin fazla gelen
kısımları dışarıda bırakılır.
VideoBrush
Belki de en ilginç fırçalardan biridir VideoBrush. ImageBrush gibi çalışan
VideoBrush kaynak olarak bir resim dosyası almak yerine video alır. Böylece
nesnelerin için hareketli bir görüntü ile doldurulabilir.
<Canvas xmlns="http://schemas.microsoft.com/client/2007" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas Width="120" Height="44">
<MediaElement Name="AyiVideo" Source="ayi.wmv" Opacity="0" IsMuted="True"></MediaElement>
<Ellipse Width="200" Height="200">
<Ellipse.Fill>
<VideoBrush SourceName="AyiVideo"></VideoBrush>
</Ellipse.Fill>
</Ellipse>
</Canvas>
</Canvas>
Yukarıdaki kodumuz içerisinde Ellipse'in Fill değerine bir VideoBrush
aktarıyoruz. Bu VideoBrush'a video kaynağı olarak
AyiVideo adında bir MediaElement bağlamışız.
VideoBrush'lar doğrudan video dosyalarını açamaz, arada aracı bir MediaElement
gerekir. Bu nedenle sahneye yerleştirdiğimiz MediaElement'imizin şeffaflığını
Opacity değerini 0 yaparak arttırıyoruz. Böylece sahnede
MediaElement gözükmeyecek. Ayrıca video ile beraber gelen sesin
de duyulmaması için yine MediaElement'e ait IsMuted özelliği
True yapıyoruz. Sonuçta aşağıdaki görüntüyü elde ediyoruz.
 VideoBrush ile aldığımız ayıcık Ellipse içerisinde.
Silverlight 1.0 içerisindeki Brush'larımız hepsi bu kadar. Hepinize kolay
gelsin.
Bundan aylaaaar önce :) Türkiye'nin ilk Silverlight eğitimini Microsoft
binasında Microsoft iş ortakları için hazırlamıştık. O günlerde konuya ilgisi
ile yıldızı parlayan bir öğrencim olan sevgili Eren Emre Kanal :) eğitim
sonrasında yazdığı bir
Silverlight makalesi ile de dikkatleri çekmişti.
Sevgili Eren'in WordPress altyapısı üzerine kurduğu Silverlight web sitesi
olan http://www.weebr.com/ karşınızda! (Gurur duyan bir hoca nidasıyla!)
Söz konusu site anında Silverlight resmi sitesinde Showcase bölümünde de Türkiye
bayrağı altında yerini aldı.
 www.weebr.com Silverlight Showcase'de.
Son olarak tekrar dikkatinizi çekmek istiyorum :) bahsettiğimiz web sitesi Debian Linux sunucu üzerinde çalışıyor ;) Yani tekrar :
Silverlight sunucu bağımsız bir teknolojidir.
PCnet'in Şubat sayısındaki yazılarımı her ay olduğu gibi yine buradan sizlere duyurmak
istiyorum :) Derginin
OKUL bölümünde AJAX, ASP.NET 3.5,
Expression Blend ve Silverlight ile ilgili yazılarım yer alıyor.
AJAX : Zaman doluyor, AJAX istekleri yolda.
Expression Blend : WPF Uygulamalarında internette
Silverlight: Silverlight ve JavaScript
ASP.NET 3.5 : ASp.NET 3.5 ve LINQ2SQL Tüm bu yazılara ek olarak
Şubat sayısına özel ".NET Framework 3.5'in Yıldızı: LINQ"
makalem de OKUL bölümünde yer alıyor :)
Hepinize kolay gelsin.
Dün İTÜ'de
Botego organizasyonu ile mini bir "İnternette
Gümüş Devrim: Silverlight" semineri yaptık. Seminer toplam 45 dakika sürdü
(sürebildi) :( Pek teknik bir sunum olmadı, benim tarzıma göre çoğu şey havada kaldı. Böyle olacağını da zaten
zaman kısıtı nedeniyle tahmin ettiğim içindir ki blogumdan sizlere semineri duyurmadım.
Özellikle seminer sonrasında bazı arkadaşların teknik soruları oldu. Bu
sorulardan yola çıkarak aslında normal seminerlerimde olduğu gibi daha geniş bir
zamanlama ile teknik içeriğe de ihtiyaç olduğu açıkça ortada.
 Gümüş Devrim: Silverlight, İTÜ, Botego
Daha önce İTÜ'de bir Silverlight semineri gerçekleştirmiştik. Umarım yakında
yeni üniversite döneminin de başlaması ile tekrar ünilerde seminerler düzenliyor
olacağım. Blogumu takip ederseniz duyurulara zaten ulaşabilirsiniz. Ayrıca
"Hocam bize de gel!" diyenler varsa :) mailinizi beklerim.
Silverlight uygulamalarında videonun yeri çok önemli, tarayıcı ve platform
bağımsız olarak istemci tarafında klasik WMV dosyalarını oynatabiliyor olmak
büyük avantaj sağlıyor. Tabi tüm bunları yapabilmek için Silverlight içerisinde
MediaElement nesneleri kullanmamız gerekiyor. Bu yazıda MediaElement'in
kullanımına ve bazı özelliklerine göz atacağız.
<Canvas xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300"
Height="300"
Background="White"
x:Name="Page">
<MediaElement Width="300"
Height="300"
Canvas.Left="0"
Canvas.Top="0" />
</Canvas>
Herhangi bir Silverlight uygulamasına yukarıdaki şekli ile bir MediaElement
yerleştirebilirsiniz. Klasik Silverlight nesnelerinde olduğu gibi
MediaElement'in de Width, Height ve Canvas.Left, Canvas.Top özellikleri ile
sahnedeki boyutu ve konumu belirlenebiliyor.
<MediaElement Width="300"
Height="300"
Canvas.Left="0"
Canvas.Top="0"
Source="Lake.wmv"
Volume="1"
IsMuted="True" />
MediaElement'e herhangi bir video dosyası yüklemek için Source
özelliğini değiştirmek yeterli. Source özelliğine bir dosya
adının yanı sıra doğrudan MMS adresleri de aktarabilirsiniz. Ayrıca
MediaElement'in Volume özelliği ile sesi veya IsMuted
Boolean özelliği ile sesin açık olup olmayacağını da ayarlama şansınız var.
<MediaElement Width="300"
Height="300"
Canvas.Left="0"
Canvas.Top="0"
Source="Lake.wmv"
Stretch="Fill" />
Son olarak MediaElement'e ait Stretch özelliği ile video görselinin
MediaElement içerisine nasıl yerleştirileceğine de karar verebilirsiniz. Bu
özelliğe verebileceğiniz üç değeri aşağıdaki şekilde tanımlayabiliriz.
- Uniform : Stretch özelliğinin varsayılan değeri olan
Uniform ile video görselinin en-boy oranı bozulmadan MediaElement içerisine
yerleştirilmesi sağlanır.
- UniformToFill: Bu seçenekte video görselinin en boy
oranı korunurken videonun boyu veya eni tam olarak MediaElement içerisini
dolduracak şekilde büyütülür ve sığmayan kesimler MediaElement'in dışında
tutularak kesilir.
- Fill: Fill seçeneği kullanıldığında video görseli
MediaElement içerisine sığacak şekilde tekrar boyutlandırılır. Bu seçenekte
videonun en-boy oranı korunmaz.
Videoyu yönetmek...
Herhangi bir video dosyasını oynatırken onu durdurabiliyor olmak önemlidir.
Silverlight ile böyle bir işlevsellik sağlayabilmek için kendi düğmelerimizi ve
kodumuzu yazmamız gerekiyor. Bu nedenle aşağıdaki şekliyle bir Silverlight
uygulaması yaratalım ve sonrasında her bir düğme için yazacağımız kodları
incleyelim.
<Canvas xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300"
Height="300"
Background="White"
x:Name="Page">
<MediaElement Width="300"
Height="300"
Canvas.Left="0"
Canvas.Top="0"
Source="Lake.wmv"
Stretch="Fill" />
x:Name="Video" />
<Canvas Width="73"
Height="31"
Canvas.Left="8"
Canvas.Top="261"
Opacity="0.7"
MouseLeftButtonDown="Oynat">
<Rectangle Width="73"
Height="31"
Fill="#FFFFFFFF"
Stroke="#FF000000"
RadiusX="16.5"
RadiusY="16.5" />
<TextBlock Width="47"
Height="21"
Canvas.Left="13"
Canvas.Top="5"
TextWrapping="Wrap"><Run Text="Oynat" /></TextBlock>
</Canvas>
<Canvas Width="73"
Height="31"
Canvas.Left="86"
Canvas.Top="261"
Opacity="0.7"
MouseLeftButtonDown="Bekle">
<Rectangle Width="73"
Height="31"
Fill="#FFFFFFFF"
Stroke="#FF000000"
RadiusX="16.5"
RadiusY="16.5" />
<TextBlock Width="47"
Height="21"
Canvas.Left="13"
Canvas.Top="5"
TextWrapping="Wrap"
Text="Bekle" />
</Canvas>
<Canvas Width="73"
Height="31"
Canvas.Left="166"
Canvas.Top="261"
Opacity="0.7"
MouseLeftButtonDown="Durdur">
<Rectangle Width="73"
Height="31"
Fill="#FFFFFFFF"
Stroke="#FF000000"
RadiusX="16.5"
RadiusY="16.5" />
<TextBlock Width="47"
Height="21"
Canvas.Left="13"
Canvas.Top="5"
TextWrapping="Wrap"
Text="Durdur" />
</Canvas>
</Canvas>
Yukarıdaki XAML kodu ile tanımlanan Silverlight nesnesinde toplam üç adet
(Oynat, Bekle, Durdur) düğme yer alıyor. Her bir düğme farklı JavaScript
fonksiyonlarına bağlanmış durumda. Şimdi sıra geldi gerekli JavaScript
fonksiyonlarını yazmaya.
function Oynat(sender)
{
sender.findName("Video").Play();
}
function Bekle(sender)
{
sender.findName("Video").Pause();
}
function Durdur(sender)
{
sender.findName("Video").Stop();
}
Her bir fonksiyonu çalıştıran düğmeye ait sender nesnesi
üzerinden findName metodunu çalıştırarak Video ismini vermiş olduğumuz
MediaElement'imizi bularak Play, Pause veya Stop
metodları ile video üzerinde gerekli işlemleri yapabiliyoruz.
Video'nun Buffer durumunu gösterme...
Video oynatılmadan önce yüklenirken önbellekleme durumunu algılayarak
kullanıcıya gösterebiliyor olmak da önemli bir işlevsellik sağlayacaktır. Bu
noktada kullanacağımız MediaElement'e ait durumun adı
BufferingProgressChanges olarak geçiyor.
<MediaElement Width="300"
Height="300"
Canvas.Left="0"
Canvas.Top="0"
Source="Lake.wmv"
Stretch="Fill"
x:Name="Video"
BufferingProgressChanged="Onbellek" />
Yukarıdaki şekli ile gerekli durumu ve çalıştırılacak olan Onbellek
JavaScript fonksiyonunu MediaElement içerisinde tanımladıktan sonra sıra geldi
gerekli JavaScript fonksiyonunu yazmaya.
function Onbellek(sender)
{
sender.findName("Fon")["Opacity"]=sender.BufferingProgress;
}
Yukarıdaki fonksiyonda sender nesnesi bizim MediaElement'imizin ta kendisi
olduğu için rahatlıkla sender üzerinden yola çıkarak MediaElement'in o anki
önbellek durumunu BufferingProgress özelliğinden alabiliyoruz. Önbellek durumu 1
ile 0 arasında decimal olarak gönderileceği için aynı değeri doğrudan başka bir
elementin şeffaflığına aktararak yükleme süresince sürekli şeffaftan görünür
hale gelen bir animasyon yaratmış oluyoruz. Peki "fon" elementi de nedir?
Aşağıdaki şekliyle fonu siyah olan bir dikdörtgeni sahneye koyarsak video
yüklenirken söz konusu dikdörtgen giderek görünüz hale gelecek, sonrasında da
üzerinde video gözükecektir.
<Rectangle Width="300"
Height="300"
Fill="#FF000000"
Stroke="#FF000000"
Canvas.Left="0"
Canvas.Top="0"
x:Name="Fon" />
Videoları maskeleme
Maskeleme işlemleri XAML kodlarında Clipping olarak geçer. O nedenle tüm
Silverlight nesnelerine olduğu gibi MediaElement'lere de Clip'ler ayarlanabilir.
Bunu için aşağıdaki gibi basit bir kod kullanabiliriz.
<MediaElement Width="300"
Height="300"
Canvas.Left="0"
Canvas.Top="0"
Source="lake.wmv"
Stretch="Fill"
x:Name="Video"
BufferingProgressChanged="Onbellek">
<MediaElement.Clip>
<EllipseGeometry
RadiusX="50"
RadiusY="50"
Center="100,100"></EllipseGeometry>
</MediaElement.Clip>
</MediaElement>
Gördüğünüz gibi MediaElement içerisinde ayrı bir
EllipseGeometry nesnesi Clip olarak tanımlanmış
durumda. Bu şekilde kod yazabileceğiniz gibi doğrudan Expression Blend
içerisinde görsel olarak da maskeleme yapma şansınız var. Blend içerisinde
herhangi iki nesneyi "Objects and Timeline" panelinden seçerek
sağ tıkladığınızda gelen menüden Path / Make Clipping Path
komutu vermeniz halinde seçili olan üstteki nesne bir alt nesneye Clip olarak
ayarlanacaktır. Aynı şekilde Clip ayarlanmış bir nesneye sağ tıkladığınızda
gelen menüden de Path / Release Clipping Path diyerek
maskelemeyi kaldırma şansınız da var.
İster Silverlight ister WPF uygulamalarında
vektörel çizimlere animasyonlar katıyor olmak hayati öneme sahip. Bu çerçevede
bizim elimizde hali hazırda bulunan vektörel çizimleri veya yapacağımız yeni
çizimleri WPF veya Silverlight'a uygun şekilde XAML kodları olarak elde etmemiz
gerekiyor. Expression Design işte tam noktada devreye giriyor.
Bir Microsoft ürünü olarak Expression Design ile ilgili
sizleri şaşırtacağına inandığım birkaç noktadan bahsetmek istiyorum. Bu
noktalardan ilki Expression Design içerisinde File / Import
menüsüne ufak bir yolculuk yaptığımızda karşımıza Adobe Photoshop ve Adobe Illustrator
dosya formatlarının da geliyor olması. PSD veya AI
dosyalarını doğrudan vektörel formatları ve katman yapıları bozulmadan
Expression Design içerisine aktarabiliyorsunuz. Böylece eldeki hazır tasarımları
hızlıca WPF veya Silverlight dünyasına taşımak mümkün oluyor. Bir diğer
şaşırtıcı nokta da File / Export menüsünde. Bu menüden WPF ve
Silverlight için XAML çıktıları almanın yanı sıra PDF veya
PSD dosyaları da alabiliyoruz.
XAML çıktı alma yolunda ilerlerken...
Expression Design içerisinde tasarım yaparken bir tasarımcı olarak dikkat
etmemiz gereken noktalardan ilki "Layers" panelinde oluşturduğumuz katmanların
yapıları ve özellikle isimleri. Expression Design içerisinde oluşturulan her bir
katman ileriki noktalarda WPF veya Silverlight dünyasında programcı tarafından
da kullanılabiliyor olacaktır. Hatta söz konusu katmanlara tasarımcının verdiği
isimler ile programcılar da ulaşacaktır. Bu nedenle tasarımcının olabildiğince
yapılsan çerçevede anlamlı katmanlamalar yaparak, yine anlamlı isimlendirmeler
yapmasında büyük fayda var. Aksi halde programcının görsel nesneleri sahnede
bulması ve gerekli kodu yazması çok daha zor olacaktır.
Bir diğer dikkat edilmesi gereken nokta da "Effects" menüsü ile ilgili.
Maalesef Expression Design içerisindeki tüm efektler WPF tarafından
desteklenmiyor, Silverlight tarafında desteklenen bir efekt ise 1.0 sürümünde
mevcut değil. Bu noktada efektler kullanırken birazdan XAML çıktısı alacağımız
ekranda bahsedeceğim detaylara dikkat etmek gerekecektir.
File / Export / XAML*
Çiziminizi tamamladıktan sonra doğrudan File / Export menüsünü açarak dosya
tipi olarak da XAML'ı seçtiğinizde "OK" düğmesine basmanızla birlikte karşınıza
yeni bir pencere gelecektir. Bu pencerede çıktı alacağımız XAML kodları ile
ilgili ayarları yapmamız gerekiyor.
 Expression Design XAML Export penceresindeki ayarlar.
İlk olarak çıktı alacağımız XAML kodunun WPF mi yoksa Silverlight ile mi
kullanılacağına karar vermemiz gerekiyor. Bu seçim XAML kodunda büyük
değişiklikleri neden olacaktır. Basit bir örnek olarak XAML dokümanının kök
elementinin WPF'de Window, Silverlight içerisinde ise Canvas olduğunu
hatırlayabiliriz. Seçimimizi yaptıktan sonra bizi daha farklı ayarlar bekliyor.
"Text"'leri ne yapacağız? Eğer çiziminiz içerisinde metinler kullanmışsanız
bunların da birer TextBlock olarak yerleştirilmesi, ya da vektörele çevrilerek
bu yazıların birer vektörel çizim olarak (vectorize) XAML koduna konması
gerekiyor. Seçimi yaparken dikkat edilmesi gereken noktalardan biri bahsi geçen
metnin programatik olarak değiştiriliip değiştirilmeyeceği detayı. Eğer metinler
programcı tarafından veritabanına vs bağlanacak ise kesinlikle TextBlock
olmaları şart, aksi halde vektörel olarak sahneye yerleştirilen bir metin
doğrudan değiştirilemeyecektir. Fakat bu detayın yanı sıra bir de işin animasyon
kısmı var. Eğer yerleştirilen metinlerin büyütülüp küçüldüğü animasyonlar
düzenlenecek ise metinleri vektörel olarak sahneye koymak daha yüksek performans
sağlayacaktır. TextBlock üzerinden yapılan büyütme ve küçültme animasyonlarında
nesne her boyut değiştirdiğinde içerisinde metin tekrar font dosyasından gerekli
bilgiler alınarak vektörel olarak yaratılacaktır. Böyle bir animasyon vektörel
bir animasyona kıyasla daha çok sistem kaynağına ihtiyaç duyar. Eğer yazılan
yazılarda boyut değiştirme animasyonları yapılacaksa ve bu yazılar programatik
olarak değiştirilmeyecekse kesinlikle "Paths" seçeneği
kullanılarak yazılar vektörele çevirlmelidir.
"Live Effects" olarak geçen gerçek zamanlı efektlerin
hepsinin WPF veya Silverlight tarafından desteklenmediğinden bahsetmiştik. Eğer
desteklenmeyen bir efekt kullanılmış ise "Rasterize all live effects"
seçeneği sayesinde efektlerin ayrı birer PNG görsel olarak kaydedilerek efekt
verilen nesnelerin arkasına yerleştirilmesini sağlayabilirsiniz. Bir diğer
seçenek ise "Only Export Live Effects supported by XAML" olarak
sadece desteklenen efektlerin XAML olarak yerleştirilmesine olanak tanıyor.
Efektlerle ilgili de performans konusunda olabildiğince dikkat etmekte fayda
var. Eğer efekt verilen nesne boyut değiştirmeyecekse, yani efekti sürekli aynı
şekilde gözükecekse söz konusu efektli bir PNG olarak yerleştirmek ileriye dönük
animasyonlarda performans artışı sağlayacaktır. Sahnede yerini değiştirdiğiniz
bir nesnenin efekti her karede tekrar baştan yaratılacağına nesnenin arkasında
bitmap de yer değiştirecektir. Böylece çok daha az işlemci gücü kullanılır.
Diğer yandan hedef nesnenin boyutunu değiştiren animasyonlar varsa arkada bir
PNG dosyasının durması efeklerin boyutlandırılamamasına, örneğin bir "Drop
Shadow" efekti ile yerleştirilen gölgenin nesneden ufak kalmasına neden
olabilir. Bu tarz durumlarda ya arkadaki PNG'yi de animasyona dahil etmek ya da
doğrudan desteklenen gerçek zamanlı efektleri tercih etmek gerekecektir.
Son olarak tercih etmemiz gereken seçenekler arasında "Image Strokes"
yapısı yer alıyor. Expression Design içerisinde vektörel çizimlerinizde
kullandığınız "stroke" yapılarının bazıları vektörelken bazıları ise bitmap.
XAML çıktısı alırken isterseniz bu stroke yapılarını detay seviyesi (level)
belirterek vektörel olarak alabilir veya doğrudan bitmap olarak da (rasterize)
kaydedebilirsiniz. Her zamanki gibi vektörel kayıtlarda animasyonlarda herhangi
bir bozulma olmazken bitmap kayıtlarda ise daha yüksek performans elde ediliyor.
Tüm ayarları yaptığımıza göre artık XAML çıktımızı almaya hazırız. "Export"
düğmesi ile çıktınızı .xaml uzantılı bir dosya olarak alıp WPF veya Silverlight
projelerinizde kullanabilirsiniz.
Hepinize kolay gelsin.
*XAML çıktıları ile ilgili sorun yaşamamak adına Expression Design'ın
Export bölümü ile ilgili büyük çapta değişiklikler içeren Expression Design SP1 yükleme paketini
bilgisayarınıza yüklemenizde fayda var.
XAML kodlarını yazarken hangi elementin ne özelliğe sahip olduğunu bulmak
bazen karışık kodlarda iyice içinden çıkılmaz bir hal alabiliyor. Bu tarz
durumlarda "Keşke bir kod düzenleyici olsa!" gibi haykırışlarda
bulunabilirsiniz. Aslında var :) Visual Studio 2008 içerisinde "Tools/Options"
menüsüne ufak bir yolculuk ile bu ayarları bulabilirsiniz.
 XAML formatlama özellikleri Visual Studio içerisinde.
Yukarıdaki şekli ile XAML kodları için "Position each attribute on a separate
line" seçeneğini işaretlerseniz bundan sonra Visual Studio içerisine
yapıştırdığınız kodlar otomatik olarak formatlanacak ve aşağıdaki hale
dönüşecektir.
<Canvas xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300"
Height="300"
Background="White"
x:Name="Page">
<Glyphs Width="147"
Height="93"
Canvas.Left="29"
Canvas.Top="76"
UnicodeString="Selamlar"
Fill="#FF000000"
FontRenderingEmSize="72"
FontUri="webdings.ttf" />
</Canvas>
Gördüğünüz gibi taglara ait her bir özellik ayrı satırlar olarak
yerleştirilmiş. Böylece çok daha kolay okunabilir bir kod sağlanabiliyor.
Tercihlerinize göre farklı ayarlar yapmanız da mümkün.
Hepinize kolay gelsin.
Daha önceki yazılarımda Silverlight 1.0 ile beraber sunucu tarafına
yerleştirilen font dosyalarının istemcide "yükleme bağımsız" ve "platform
bağımsız" olarak nasıl kullanılabileceğinden bahsetmiştim. Bunlara ek olarak
daha kolay bir kullanım ile özellikle farklı font dosyalarındaki belirli
görselleri gösterme amacıyla kullanabileceğiniz bir de Glyphs
kontrolümüz bulunuyor.
Örneğimizde meşhur Webdings font serisinden bir font kullanarak istediğimiz
bir görselin gösterilmesini sağlayacağız. Bunun için herhangi bir JavaScript
kodu yazmamız gerekmiyor.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="300"
Background="White"
x:Name="Page"
>
<Glyphs Width="147" Height="93" Canvas.Left="29" Canvas.Top="76" Fill="#FF000000"
FontRenderingEmSize="72" Indices="134"
FontUri="webdings.ttf"/>
</Canvas>
Yukarıdaki XAML kodu içerisinde özellikle koyu yazılı bölgeye dikkat etmekte
fayda var. Webdings.ttf dosyası Silverlight tarafından otomatik olarak sunucudan
indirilerek font içerisindeki karakter tablosundan 134. karakter alınarak
ekranda gösterilecektir.
 Glyphs ile font dosyasından alınan vektörel görsel.
Fontlardan tek tek görsel almanın yanı sıra isterseniz Glyphs
kontrolünü belirli bir yazı bir font ile göstermek için de kullanabilirsiniz. Bu
noktada benim tercihim yazının başında belirttiğim ve daha önceki yazılarımdaki
teknik olacaktır fakat bu tekniğin avantajı herhangi bir JavaScript kodu
yazmıyor olmak olarak da değerlendirilebilir :)
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="300"
Background="White"
x:Name="Page"
>
<Glyphs Width="147" Height="93" Canvas.Left="29" Canvas.Top="76"
UnicodeString="Selamlar" Fill="#FF000000" FontRenderingEmSize="72"
FontUri="webdings.ttf"/>
</Canvas>
Bu sefer farklı olarak Indices tanımlamasını yapmak yerine
doğrudan göstermek istediğimiz karakterleri UnicodeString
parametresine aktarıyoruz.
Hepinize kolay gelsin.
Silverlight 1.0 ile beraber gelen ve hakkında belki de en az bahsedilen
kontrollerden biri de InkPresenter kontrolüdür. InkPresenter
kontrolü ile web ortamında TabletPC'lerdeki kalemler ile yazı girişi ve doğrudan
dokunmatik ekranlarda elle çizimlerin yapılabilmesi sağlanabilir. Böylece
kullanıcılar web sitenizde görsel öğeler , fotoğraflar, videolar üzerine bile
kolaylıkla notlar alabilecektir.
Silverlight ile beraber gelen InkPresenter yapısında her şey
StylusPoint'ler şeklinde yaratılır. Birden çok StylusPoint bir
StylusPointCollection içerisinde StylusPoints
adı altında saklanır. Her bir Collection'dan bir Stroke
oluşturulur ve Stroke'lar da StrokeCollection
ile toparlanır. Tüm bu yapıların her birinin kendine has özellikleri, metodları
bulunur. Çok fazla teknik bilgiye boğulmadan hemen bir uygulama yaparak
InkPresenter nesnesini nasıl kullanabileceğimize bakalım.
İlk olarak sahneye bir InkPresenter koyarak fonunu da beyaz rengine
ayarlıyoruz. Ayrıca InkPresenter nesnesinin toplam üç farklı event'ını (MouseLeftButtonDown,
MouseMove ve MouseLeftButtonUp) farklı JavaScript fonksiyonların da bağlamamız
gerekiyor. Elimizdeki XAML aşağıdaki şekilde sonlanıyor.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="300"
Background="White"
x:Name="Page"
>
<InkPresenter Background="White" Width="303" Height="300" Canvas.Left="0" Canvas.Top="0"
MouseLeftButtonDown="MouseDown" MouseMove="MouseMove" MouseLeftButtonUp="MouseUp"/>
</Canvas>
Toplam üç farklı event kullanacağız. MouseLeftButtonDown ile
farenin sol tuşuna basıldığı anda çizim yapmaya başlayacağız. MouseMove
yani fare hareket ettikçe yaptığımız çizime yeni noktalar ekleyeceğiz,
MouseLeftButtonUp ile farenin tuşu serbest bırakıldığında çizimi
tamamlayacağız.
var YeniStroke;
İlk olarak yukarıdaki şekilde tüm JavaScript event'larımızda kullanılmak
üzere global bir YeniStroke değişkeni tanımlıyoruz. Fare ile
basıldığında bu değişken üzerinden yeni bir çizgi yaratacağız ve fare hareket
ettikçe bu değişkeni kontrol ederek eğer yeni bir çizgi yaratmışsak çizgiye yeni
noktalar ekleyeceğiz. Eğer yeni bir çizgi yaratmamışsak demek ki farenin
düğmesine basılmamış. Gelelim hemen farenin düğmesine ilk tıklandığında
çalışacak olan MouseLeftButtonDown durumunda neler
yapacağımıza.
function MouseDown(sender,args)
{
sender.CaptureMouse();
//Çizgmizi yaratalım
YeniStroke = sender.getHost().content.createFromXaml("<Stroke/>");
//Çizginin özelliklerini belirmeke için gerekli nesneyi yaratalım.
var StrokeSekli = sender.getHost().content.createFromXaml("<DrawingAttributes/>");
//Yarattığımız çizgi özelliklerini çizgimize aktaralım.
YeniStroke.DrawingAttributes = StrokeSekli;
//Çizgi özelliklerini belirleyelim.
YeniStroke.DrawingAttributes.Width = 4;
YeniStroke.DrawingAttributes.Height = 4;
YeniStroke.DrawingAttributes.Color = "Black";
//Yeni gelen Stylus noktaları çizgimize ekleyelim.
YeniStroke.StylusPoints.AddStylusPoints(args.GetStylusPoints(sender));
//Çizgimizi InkPresenter kontrolüne ekleyelim.
sender.Strokes.add(YeniStroke);
}
Olabildiğince satır içi yorumlarla tek tek neler yaptığımızı anlatmaya
çalıştım. Genel olarak başlangıçta bir çizgi yaratmamız gerekiyor.
Stroke yarattıktan sonra onun özelliklerini belirlemek üzere
DrawingAttributes yaratarak Stroke içerisine ekliyoruz. Sonrasında
MouseLeftButtonDown durumuna parametre olarak gelen
args değişkeni üzerinden GetStylusPoints metodu ile
çizilen noktaları alarak kendi çizgimize ekliyoruz. En sonunda da çizgimizi
InkPresenter içerisine yerleştiriyoruz. Sıra geldi fare hereket
ettikçe çalışacak olan MouseMove durumundaki kodu yazmaya.
function MouseMove(sender,args)
{
//En son eklenen çizgi hala çiziliyor mu?
if (YeniStroke!=null)
{
//En son eklenen çizgiye yeni gelen noktaları ekleyelim.
YeniStroke.StylusPoints.AddStylusPoints(args.GetStylusPoints(sender));
}
}
Fare hareket ettikçe acaba daha önce yeni bir çizgi yaratmaya başladık mı
diye ufak bir kontrol yapıyoruz. Eğer yaratmaya başlamadıysak zaten yapacak bir
şey yok. Ama eğer ki yeni bir çizgi yaratmaya başlamışsak bunu global
değişkenimize de aktarmışız demektir. Bu durumda yeni gelen noktaları da söz
konusu çizgiye eklememiz gerekir. Yine MouseLeftButtonDown'da
olduğu gibi GetStylusPoints ile yeni noktaları alarak çizgimize
ekliyoruz. Son olarak sıra geldi MouseLeftButtonDown durumunu yazmaya.
function MouseUp(sender,args)
{
//Çizgi bitti. Değişkeni yok et.
YeniStroke = null;
sender.releaseMouseCapture();
}
Farenin sol düğmesi bırakıldığı anda biz de global değişkenimizi yok ediyoruz.
Böylece artık fare ekranda hareket edildiğinde çizgiye yeni noktalar
eklenmeyecek.
 InkPresenter çizimi fare ile bu kadar olur :)
İşte hepsi bu kadar, InkPresenter'ı bir resim (Image) veya
video (MediaElement) üzerine şeffaf olarak yerleştirerek de kullanabilirsiniz.
Hepinize kolay gelsin.
Son üç gündür Microsoft İstanbul ofislerinde Students 2 Business
programı çerçevesinde bir Silverlight eğitimi sunuyordum. Eğitim sanırım şu ana
kadar Türkiye'de yapılan en geniş içerikli (3 tam gün) eğitim oldu ve maalesef
buna rağmen her zamanki gibi süre "yetmedi de yetmedi". Keşke daha çok zamanımız
olsa, daha çok konuya değinebilsek ve daha zengin uygulamalar yapabilseydik.
 Microsoft İstanbul, S2B Silverlight Eğitimi
Her şey bir kenara benim için çok zevkli ve eğlenceli bir eğitimdi. Eğitimin
organizasyonunda Microsoft'tan Students 2 Business program yöneticisi
Burak Sarıca'ya ve Burcu Kutlu'ya çok teşekkür
ediyorum. Eğitimde yaptığımız, bazılarını yarı bıraktığımız :) çalışmaların
projelerini aşağıdaki adresten indirebilirsiniz.
Örnek Projeler - 26012008_2.zip (29.35 KB)
Visual Studio 2008 ile beraber JavaScript
Intellisense geldiğinden her yerde bahsediliyor ama kimse bunun nasıl
kullanılacağından bahsetmiyor gibime geldi :) Herkes sadece Ctrl+Space
ile gelen bir Intellisense'den ötesi yokmuş gibi davranıyor oysa çok daha ötesi
var.
Varsayalım ki birden çok JavaScript dosyasının bulunduğu bir projede
çalışıyorsunuz ve iki numaralı JavaScript dosyası içerisinde çalışırken "keşke
bir numaralı dosyadaki metodlar Intellisense de gözükseydi!" dediniz. İşte
size çözüm;
 Import JavaScript Intellisense
İsterseniz hazırlamış olduğunuz JavaScript sınıfları, metodları başka bir
yazılım geliştirici tarafından kullanılacaksa Intellisense üzerinde gözükecek
şekilde açıklama satırlarını kaynak kodunuza da yerleştirebilirsiniz.
 Metod açıklaması tooltip içerisinde.
Yukarıdaki şekilde herhangi bir JavaScript metodu içerisinde XML yazımı ile
gerekli açıklamaları yerleştirirseniz Visual Studio 2008 otomatik olarak bu
açıklamaları Intellisense ile beraber gelen ipuçlarında gösterecektir.
 Metod parametrelerine dair ipuçları.
Hepinize kolay gelsin.
Beklediğim an geldi! Silverlight 1.0 Plug-In artık
Windows Update ile dağıtılıyor. Bugün itibari ile Windows Update
içerisinde Silverlight 1.0 Plug-In ve tüm güncellemeler "optional" başlığı
altında listelenecek. Ayrıca WSUS üzerinden de Products and Classification
kısmında gözükecek ve "feature pack" olarak yer alacak. Kurumsal Silverlight kurulumu ile ilgili aşağıdaki adresten gerekli dokümanı bilgisayarınıza indirerek inceleyebilirsiniz.
http://download.microsoft.com/download/.../Silverlight%20Deployment%20Guide.doc
Hepimize hayırlı, uğurlu olsun :)
Silverlight 1.0 ile MediaElement kullanarak
MMS adresleri üzerinden gelen "on-demand" veya "live"
yayınları kullanıcılara gösterme şansımız var. Bu yazıda Windows Media
Services ile Silverlight'ın beraber kullanılmasıyla
ilgili karşılaşabileceğiniz sorunlara ve çözümlerine değinirken özellikle canlı
bir yayın örneği yapacağız.
Windows Media Services ayarları...
İlk aşamada ayarlanması gereken şey sunucunun ta kendisi. Windows Media
Services yüklü bir sunucuda PUSH desteği olan bir Publishing Point
yaratmamız gerekiyor. "PUSH desteği" demek uzaktan bir Encoder'ın bağlanarak bu
Publishing Point (Yayın Noktası)'e veri aktarabileceği anlamına geliyor. Eğer
uzaktan bir kaynak bağlanmaz ise herhangi bir yayın da olmayacak. Bunu
yapabilmek için Media Services içerisinde Publishing Points
listesine sağ tıklayarak gelen menüden "Add Publishing Point (Advanced)"
seçeneğini işaretliyoruz.
 "Publishing Point" ayarları
Karşınıza çıkan ekranda yukarıdaki gibi yapacağınız ayarlar sonrasında geriye
kalıyor ince detaylara :) Aslında burada işler biraz karışıyor. Silverlight MMS
adreslerinden video oynatabiliyor olsa da aslında MMS protokolü ile video yayını
alamıyor. "Nasıl yani?" dediğinizi duyar gibiyim. Bir MMS adresi
üzerinden üç farlı protokolde yayın yapılabilir, bunlar HTTP, MMS
ve RTSP şeklinde. Her üç protokol için de Media
Services içerisinde sunucu bazında genel ayarlar yapılabiliyor. Silverlight bu
protokoller arasından HTTP'yi kullanıyor ve maalesef Media Services ile beraber
varsayılan ayarlarda HTTP protokolü ile MMS üzerinden yayın 80 portu üzerinden
yapılıyor. "Maalesef" dememin nedeni çoğu Media Server'ın aynı anda IIS olarak
da kullanılmasından kaynaklanıyor. Eğer sunucunuzda IIS varsa ve Media Services
ile Silverlight tarafına video göndermek istiyorsanız özel bir ayar yaparak
Media Services'ın MMS üzerinden HTTP protokolünde başka bir port kullanmasını
sağlamalı ve Silverlight uygulamalarınıza da söz konusu port bilgisini adres ile
beraber aktarmalısınız. Eğer sunucunuzda IIS çalışmıyorsa zaten herhangi bir
sorun yaşamazsınız.
Biz örnek olması için Media Services sunucusunun MMS üzerinden HTTP protokolü
ile video gönderirken kullanacağı portu değiştirelim. Media Services yönetim
penceresinde sunucuya tıkladıktan sonra sağ panelde "Properties" sayfasına
geçerek "Control Protocol" ayarlarına geçin.
 Media Services ayarları
Yukarıdaki ekranda da görebileceğiniz üzere "WMS HTTP Server Control Protocol"
seçeneğineçift tıkladığınızda özel bir ayar penceresi açılacaktır. Bu pencerede
"Use Default Port" yerine özel bir port numarası ayarlamanız gerekecektir.
Böylece Silverlight bu port üzerinden HTTP ile MMS adresine bağlanabilecek.
Windows Media Player gibi istemci yazılımları doğrudan MMS protokolünü
kullanacağı için bu ayardan etkilenmeyeceklerdir.
Dikkat Dikkat!
"On-Demand" veya "Live" bir Publishing Point düzenlerken dikkat etmeniz
gereken bir diğer nokta da kesinlikle Playlist dosyaları kullanmamanız
gerektiği. Silverlight "Playlist" desteği yok.
Yayın Zamanı
Sıra geldi yayın için videoyu gönderecek olan istemciyi ayarlamaya. Bunun
için Expression Encoder kullanacağız. Expression Encoder içerisinde "View
/ Live Encoding Mode" menüsünden yayın moduna geçiş yapabilirsiniz.
Burada sisteminize bağlı kameraları veya diskinizde dosyaları kullanabileceğiniz
bir yayın ortamı bulunuyor. Bizi şu an ilgilendiren esas ayarlar "Output"
tabında yer alıyor.
 Expression Encoder ile canlı yayındayız.
Bu ekranda "Publishing Point" seçeneğini işaretleyerek bağlanacağımız
sunucunun IP:Port ve Publishing Point adını girmemiz gerekiyor. (Örn:
http://127.0.0.1:8080/deneme) Hemen sonrasında "Pre Connect"
düğmesine basarak authentication işlemini de yapabilirsiniz. Yayına hazırsınız,
artık "Start"
düğmesine basmanız yeterli."
Silverlight ile canlı yayın!
Geldik işin en kolay noktasına. Aslında tek yapmamız gereken artık ekrana bir
MediaElement koyup Source özelliğini de Publishing Point'imize yönlendirmek.
Aşağıdaki gibi bir kod başlangıç seviyesinde işimizi görecektir.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480"
Background="White"
x:Name="Page"
>
<MediaElement Width="401" Height="278" Canvas.Left="106" Canvas.Top="90" Source="mms://127.0.0.1:8080/deneme"/>
</Canvas>
Hepinize kolay gelsin.
Dün Genç
Girişimciler Kulübü çatısında çok verimli bir Silverlight
semineri gerçekleştirdik. Seminer boyunca giriş seviyesinden Silverlight ile
farklı veri uygulamalarına kadar geniş bir yelpazeye değindik. Toplam 3 saat
olarak planladığımız semineri 4 saate uzatmamıza rağmen yetmedi de yetmedi :)
 Genç Girişimciler Kulübü Silverlight Semineri
Seminerde kullandığım sunumu aşağıdaki adresten indirebilirsiniz.
Silverlight Semineri Slaytları - 20012008_5.xps (1.96 MB)
Katılan herkese çok teşekkürler. Bir başka seminerde görüşmek dileği ile...
Uzun süredir seminerlerimde, eğitimlerimde sürekli Silverlight'ın
hem istemci hem de sunucu tarafında platform bağımsız olduğunu söyleyip
duruyorum :) İşte size kanıtı.
Pusula Yayıncılık web sitesinde yeni bir hizmet olarak artık
kitapların örnek bölümlerini yayınlanıyor olacak. Bu yeniliğe bir ilk olarak
hemen benim ASP.NET AJAX kitabım ile başladık. Hazırladığımız Silverlight
uygulaması ile artık kitapları gerçekten okuyormuş gibi internet ortamında
inceleyebileceksiniz. Sistem tabi ki dinamik altyapısı ile kitap ekleme işlemini
de kolaylaştırıyor.
 Silverlight ile örnek kitap bölümleri Pusula Yayıncılık sitesinde.
Esas önemli olan bahsettiğimiz tüm bu uygulamaların bir Linux
sunucu üzerinden yayınlanıyor olması. Kurumun kendi sitesi PHP
ile hazırlanıp hali hazırda bir Linux sunucu üzerinde bulunduğu
için biz de Silverlight uygulamamızı Linux üzerine yükledik.
Hiçbir sorun yaşamadık desem yalan olur :) Linux sunucularda dosya isimlerindeki
harflerin büyük ve küçük harf hassasiyetine sahip olması bizi biraz uğraştırdı
fakat bunun dışında herhangi bir sıkıntı yaşamadık.
Aşağıdaki adresten benim kitabım sayfasına ulaşarak "Örnek Bölüm" linkine
tıkladıktan sonra karşınıza Silverlight uygulamamız gelecektir.
http://www.pusula.com/2/index.php?option=com_pusula&func=detail&Itemid=1&id=24
Çok yakında sitedeki tüm kitapların örnek bölüm içerikleri internet ortamına
Silverlight ile aktarılacak.
Hepinize kolay gelsin.
Bu hafta sonu Cumartesi günü saat 14.00-17.00
arasında
Genç Girişimciler Kulübü'nde Silverlight semineri veriyor
olacağım. Hepinizi beklerim. Özellikle CETURK seminerine gelen arkadaşları da
bekliyorum :) Tamamen Silverlight işleyeceğimiz için biraz daha derinlere dalma
şansımız olacaktır. WPF konusunda ileride ayrı bir seminer daha düzenlemeyi
planladığımız için bu seminerde WPF işlemeyeceğiz. Expression Blend 2
ile Silverlight ve özellikle data uygulamalarına değineceğiz.

Etkinlik katılım formu ve detayları için aşağıdaki adresi ziyaret
edebilirsiniz.
http://www.gencgirisimciler.org/bpi.asp?cid=594&caid=311
Dün sevgili tasarım dehamız
Ercan Altuğ ve
dostum Eralp Erat ile
beraber CETURK
organizasyonunda güzel bir bilişim günü yaşadık. Microsoft ve Ineta
sponsorluğunda Microsoft İstanbul ofislerinde düzenlediğimiz gün içerisinde
toplam üç seminer ile Expression Web, Design, Blend, WPF, Silverlight,
C#3.0 ve LINQ konularına zaman elverdikçe detaylıca
değinmeye çalıştık.
Benim sunduğum Silverlight ve WPF bölümünün slaytlarını aşağıdaki adresten
indirebilirsiniz.
Silverlight ve WPF Slaytlarını İndir - 13012008_1.xps (5.89 MB)
Organizasyonda emeklerinden dolayı tüm CETURK ekibine çok teşekkür ediyorum.
Aktiviteden bir fotoğraf ile yazımı sonlandırıyorum :)
 2008 Microsoft Vizyonu ve Yeni Teknolojileri Semineri
Bu hafta Microsoft İstanbul binasında gerçekleştirilen
Microsoft İş Ortakları'ndan seçilmiş .NET yazılım geliştiricilere hitap eden
Visual Studio 2008 eğitimleri çerçevesinde Silverlight
ve WPF eğitimlerini verdim. Eğitimlerimde çok fazla sunum kullanmayı
sevmeyen biri olmanın yanı sıra "bol bol" konuşarak yeni yazılım geliştirme ve
teknoloji konseptlerini anlatırken slaytlardan yardım almayı da ihmal etmiyorum.
Burada eğitime katılan arkadaşlara söz verdiğim üzere slaytları sizlerle
paylaşıyorum.
Sunum Dosyaları - 11012008_2.zip (5.99 MB)
Katılan herkese çok teşekkürler.
Silverlight uygulamalarının yeri geldiğinde tam ekran olarak da
kullanılabildiğini örneklerde görmüşsünüzdür. İster amacınız tam ekran video
oynatmak olsun ister kullanıcılarınıza bir web sitesinden öte deneyimler
yaşatmak olsun Silverlight ile kolaylıkla internet üzerinden yayınlanan tam
ekran uygulamalar hazırlayabilirsiniz.
Örneğimizde web sitesi içerisindeki bir videoyu oynatan bir
MediaElement kullanacağız. Silverlight animasyonuna fare ile
tıklandığında animasyon tam ekran olacak ve beraberinde video da tam ekran
olarak oynatılacak. Uygulamamızın XAML kodu aşağıdaki şekilde olabilir.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="300"
Background="White"
x:Name="Page"
>
<MediaElement Canvas.Left="0" Canvas.Top="0" Source="Bear.wmv" Width="300" Height="300" x:Name="Medya"/>
</Canvas>
Silverlight uygulamamız ilk açıldığında handeLoad durumunu
çalıştıracaktır. Animasyon başlatıldığı gibi ilk olarak tüm animasyondaki fare
tıklamalarını yakalamamız gerekecek. Böylece herhangi bir tıklama durumunda
doğrudan tam ekran moduna geçebiliriz.
handleLoad: function(control, userContext, rootElement)
{
rootElement.addEventListener("MouseLeftButtonDown", Silverlight.createDelegate(this, this.MouseLeftButtonDown));
control.Content.OnFullScreenChange = this.OnFullScreenChange;
}
Yukarıdaki kod içerisinde ilk satırda fare tıklamalarını yakalayacak olan
JavaScript fonksiyonumuzu bağlıyoruz. Bir sonraki satırda ise Silverlight
animasyonunun FullScreen yani tam ekran olma durumu
değiştiğinde çalıştırılmak üzere bir JavaScript fonksiyonu tanımlıyoruz. Böylece
animasyon tam ekran moduna geçtiğinde ek olarak video gösterim işlemini yapan
MediaElement'i de tam ekran yapacağız. Unutmayın ki MediaElement
toplam animasyonun içerisinde sadece bağımsız bir nesne. Tam ekran olan şey
bizim Silverlight animasyonumuz MediaElement değil.
MouseLeftButtonDown: function(sender, keyEventArgs)
{
sender.GetHost().Content.FullScreen = true;
}
MouseLeftButtonDown durumuna iletilen parametreler arasından
sender'ı alarak GetHost() metodu ile
Silverlight animasyonumuzu yakalıyor ve içeriğine ait FullScreen
özelliğini true yaparak tam ekran moduna geçişi sağlıyoruz.
Sıra geldi tam ekran moduna geçişi algılayarak animasyon içerisindeki nesneleri
uygun boyutlara getirecek olan kodumuza.
OnFullScreenChange: function(sender, keyEventArgs)
{
sender.findName("Medya").Height=sender.getHost().content.actualHeight;
sender.findName("Medya").Width=sender.getHost().content.actualWidth;
}
Yukarıda da gördüğünüz gibi doğrudan Medya adındaki
MediaElement nesnemizi yakalayarak genişlik ve yükseklik değerlerini
değiştiriyoruz. Silverlight animasyonunun tam boyutunu alabilmek için yine
Content üzerinden bu sefer actualHeight ve
actualWidth özelliklerini kullanıyoruz. Böylece tam olarak
ekranın boyutunu alarak MediaElement'imizi tam ekran boyutuna büyütebiliyoruz.
Tam ekran modundan çıkış ile ilgili kurallar zaten bizim değiştiremeyeceğimiz
şekilde Silverlight Plug-In tarafından tanımlanmış durumda. Kullanıcılar
Esc tuşu ile tam ekrandan çıkış yapabiliyorlar. Konu ile ilgili ufak
bir uyarı tam ekran moduna geçiş esnasında otomatik olarak gösteriliyor.
Uygulamamızın son halindeki JavaScript dosyasında bakarsak sonuç aşağıdaki
gibi.
if (!window.UntitledProject1)
window.UntitledProject1 = {};
UntitledProject1.Page = function()
{
}
UntitledProject1.Page.prototype =
{
handleLoad: function(control, userContext, rootElement)
{
rootElement.addEventListener("MouseLeftButtonDown", Silverlight.createDelegate(this, this.MouseLeftButtonDown));
control.Content.OnFullScreenChange = this.OnFullScreenChange;
},
MouseLeftButtonDown: function(sender, keyEventArgs)
{
sender.GetHost().Content.FullScreen = true;
},
OnFullScreenChange: function(sender, keyEventArgs)
{
sender.findName("Medya").Height=sender.getHost().content.actualHeight;
sender.findName("Medya").Width=sender.getHost().content.actualWidth;
}
}
Hepinize kolay gelsin.
Silverlight ile beraber gelen belki de en güzel özelliklerden biri
Silverlight animasyonlarında kullanabileceğiniz harici içeriği sunucudan
istemciye indirirken bir ZIP paketi şeklinde indirerek
kullanabiliyor olmanız. Aşağıdaki örnekte uygulamamız bir ZIP paketini sunucudan
indirerek içerisinde bir resim dosyasını ekranda göstermek üzere bir Silverlight
Image nesnesine aktaracak. Tüm bunları yaparkan söz konusu ZIP
paketi yüklenirken bir de yüklenme durumunu gösteren görsel çubuk
hazırlayacağız.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="300"
Background="White"
x:Name="Page"
>
<Rectangle Width="245" Height="38" Stroke="#FF000000" Canvas.Left="28" Canvas.Top="23" x:Name="DurumCubugu">
<Rectangle.Fill>
<LinearGradientBrush EndPoint="0.988,0.5" StartPoint="0.012,0.5">
<GradientStop Color="#FF000000" Offset="0"/>
<GradientStop Color="#FF885656" Offset="0.772"/>
<GradientStop Color="#FF000000" Offset="1"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
<TextBlock Width="153" Height="19" Canvas.Left="40" Canvas.Top="34" TextWrapping="Wrap" x:Name="DurumMetin" Foreground="#FFFFFFFF"></TextBlock>
<Image Width="245" Height="189" Canvas.Left="28" Canvas.Top="80" x:Name="Foto"/>
</Canvas>
Yukarıdaki Silverlight animasyonu içerisinde dosyanın yüklenme durumunu
gösterecek olan DurumCubugu adında bir dikdörtgenimiz var. Bu
dikdörtgenin genişliğini değiştirerek yükleme işlemini görsel olarak kullanıcıya
yansıtacağız. Söz konusu dikdörtgenin üzerine denk gelecek şekilde bir de
TextBlock yerleştirilmiş. DurumMetin adındaki
bu TextBlock içerisinde 40% şeklinde yükleme durumunu yazılı olarak
göstereceğiz. Son olarak yüklediğimiz ZIP dosyasındaki bir resmi göstermek için
de adı Foto olan bir Image nesnemiz bulunuyor.
Gelin şimdi ilk olarak sunucudan asenkron bir şekilde ZIP paketini indirecek
olan downloader nesnemizi yaratacağımız kodları inceleyelim.
var yukleme = control.CreateObject("downloader");
yukleme.AddEventListener("Completed", Bitti);
yukleme.AddEventListener("DownloadProgressChanged", DurumDegisti);
yukleme.Open("GET", "paket.zip");
yukleme.Send();
Yukarıdaki kod Silverlight uygulaması ilk çalıştırıldığında hemen devreye
girecek. handleLoad event handler içerisinde bulunan
control parametresinden yola çıkarak yukleme adındaki
downloader nesnemizi yaratıyoruz. Bu nesneye toplam iki tane
EventListener ekleyeceğiz. Download işlemi tamamlandığımda
çalıştırılmak üzere Bitti adındaki bir JavaScript fonksiyonunu
Completed durumuna referans olarak veriyoruz. Ayrıca download
durumunda her değişiklik olduğunda çalıştırılmak üzere bir de
DurumDegisti adında bir JavaScript fonksiyonunu
DownloadProgressChanged durumuna bağlıyoruz. Bu her iki fonksiyonu da
ayrıca birazdan yazacağız. Son olarak sunucudan alacağımız dosya olan
paket.zip dosyasını da belirterek Send() metodu ile
talebimizi sunucuya gönderiyoruz.
Gelelim yükleme durumu değiştiğinde çalıştırılacak olan DurumDegisti
fonksiyonunu yazmaya.
function DurumDegisti(sender, eventArgs)
{
sender.FindName("DurumCubugu").Width =
sender.DownloadProgress * 245;
sender.FindName("DurumMetin").Text = Math.floor(sender.DownloadProgress * 100) + "%";
}
Her durum değişikliğinde ilk olarak DurumCubugu adındaki
Silverlight dikdörtgenimizi bularak genişliğini değiştiriyoruz. Söz konusu
dikdörtgenin maksimum genişliği 245 şeklinde olduğu için bize bir üzerinden
gelen DownloadProgress özelliğini doğrudan 245 ile çarparak
dikdörtgenin genişliğine aktarıyoruz. Sonrasında da yine aynı değeri 100 ile
çarparak yüz üzerinden ne kadar yükleme yapıldığını bularak bu sefer de
DurumMetin adındaki TextBlock nesnemizin içerisine yazdırıyoruz. Bunu yaparken
gelen değeri Math.floor adındaki klasik bir JavaScript
fonksiyonu ile yuvarlıyoruz.
Peki download işlemi bittiğinde ne yapacağız? ZIP içerisinden dosyamızı
alarak nasıl Image nesnesine aktaracağız?
function Bitti(sender, eventArgs)
{
sender.findName("Foto").SetSource(sender, "IMG_5237.jpg");
}
Yukarıda da gördüğünüz üzere aslında durum oldukça basit. Image
nesnemiz olan Foto nesnesini bulduktan sonra SetSource
metodunu kullanıyoruz. Kaynak olarak sender, yani ZIP
dosyamızdan gelen veriyi gösterdikten sonra kaynak paketteki dosya adını da
vermemiz yeterli oluyor.
Silverlight uygulamasının tam JavaScript kodu aşağıdaki şekilde sonlanıyor.
if (!window.UntitledProject4)
window.UntitledProject4 = {};
UntitledProject4.Page = function()
{
}
UntitledProject4.Page.prototype =
{
handleLoad: function(control, userContext, rootElement)
{
var yukleme = control.CreateObject("downloader");
yukleme.AddEventListener("Completed", Bitti);
yukleme.AddEventListener("DownloadProgressChanged", DurumDegisti);
yukleme.Open("GET", "paket.zip");
yukleme.Send();
}
}
function Bitti(sender, eventArgs)
{
sender.findName("Foto").SetSource(sender, "IMG_5237.jpg");
}
function DurumDegisti(sender, eventArgs)
{
sender.FindName("DurumCubugu").Width = sender.DownloadProgress * 245;
sender.FindName("DurumMetin").Text = Math.floor(sender.DownloadProgress * 100) + "%";
}
Hepinize kolay gelsin.
Blog sistemi olarak Windows Live Spaces'ı kullanıyorsanız
beraberinde Windows Live Writer'ı da kullandığınızdan eminim.
Tabi bunun için illa Live Spaces kullanmak zorunda değilsiniz. Belirli standartl
çerçevesinde Live Writer şu an benim yazmakta olduğum blog sitemle de uyumlu.
Rahatlıkla mesajlarımı LiveWriter üzerinden yazarak gönderebiliyorum.
Önceki yazılarımda bolca
Silverlight Streaming Servis'lerinden bahsetmiştim,
hatta Expression Encoder ile entegre olarak SSS üzerindeki 4GB alanınıza
otomatik video yükleyebildiğimizi bile görmüştük. Peki ya bu videoları blogunuz
koymak istiyorsanız? Aslında çok zor değil; sistemin size sağladığı IFRAME
kodunu kopyalamanız yeterli fakat LiveWriter kullanıyorsanız çok daha kolayı
var.
 Silverlight Streaming Servis'leri ve LiveWriter Entegrasyonu
http://gallery.live.com/liveitemdetail.aspx?li=9f952b71-9883-4937-9f28-1e58002bb2ce&pl=8&bt=9
Yukarıdaki adresten LiveWriter Silverlight Plug-In'i
indirerek bilgisayarınıza kurduktan sonra doğrudan LiveWriter içerisinde SSS
AccountID ve Key girerek yayındaki tüm Silverlight uygulamalarınıza erişebiliyor
ve istediğinizi blog mesajınıza ekleyebiliyorsunuz.
Hepinize kolay gelsin.
PCnet'in
Ocak sayısındaki yazılarımı her ay olduğu gibi yine buradan sizlere duyurmak
istiyorum :) Derginin
OKUL bölümünde AJAX, ASP.NET 3.5,
Expression Blend, Expression Design, Silverlight ve
Expression Web ile ilgili yazılarım yer alıyor.
AJAX : UpdateProgress ile asenkron yüklemelerin takibi
Expression Blend : Animasyonlar ve Tetikleyiciler
Expression Web: Expression Web ile Veri Oyunları
Expression Design : Vektörel Çizim Araçları
Tüm bu yazılara ek olarak Ocak sayısına özel sürpriz makalelerim :)
FaceBook uygulamanızı geliştirin ! :
ASP.NET bilgisiyle kolay yoldan FaceBook uygulamaları geliştirmenin yollarını inceliyoruz.
Visual Studio 2008 Bilgisayarlarımızda! : Visual Studio 2008 ve ücretsiz Express sürümleri bilgisayarlarımıza girdi. Peki yeni neler geldi?
Hepsi PCnet Ocak sayısında! :)
Hepinize kolay gelsin.
2008'in ilk aktivitesini
CETURK.com organizasyonunda Microsoft, İstanbul / Dikilitaş binasında
gerçekleştiriyoruz. "2008 Microsoft Vizyonu ve Yeni Teknolojileri
Semineri" olarak adlandırdığımız güne hepiniz davetlisiniz :)
12 Ocak, Cumartesi günü sabah 10'dan başlayarak
17.30'a kadar sürecek olan seminerlerin konuları arasında
Expression Web, Design, Blend, Silverlight, Visual Studio 2008, LINQ
bulunuyor. Expression Blend ile WPF Animasyonları ve
Silverlight 1.0, 2.0 Uygulamaları bölümünü 12.30-14.30
arasında ben sunuyor olacağım.
Programın detayları ve seminere kayıt için aşağıdaki linki kullanabilirsiniz.
http://www.ceturk.com/etkinlikkayit.asp?id=35
Dün KKTC, Doğu Akdeniz Üniversitesi'nde 3 saatlik bir
Silverlight semineri düzenledik. Seminer boyunca gelen sorular ve yoğun
ilgi beni gerçekten çok sevindirdi. Aşağıda sizlerle seminerde kullanmış olduğum
sunumu paylaşıyorum. Semineri İngilizce olarak düzenlediğimiz için sunumlar da
ingilizce.
Silverlight Sunumları - 27122007_2.pdf (1,3 MB)
Seminerin düzenlenmesinde katkılarından dolayı DAÜ ACM
grubundan Arif Görkem Güngör'e buradan teşekkür ediyorum. Son olarak aktiviteden bir
fotoğraf ile yazımı sonlandırıyorum ;)
 KKTC, Doğu Akdeniz Üniversitesi Silverlight Semineri
Eğer Visual Studio 2008'e geçiş yaptıysanız yeni bir proje yarattığınızda
Silverlight 1.0 seçeneğinin var olmadığını görerek eminim ki siz de benim gibi
hayal kırıklığına uğramışsınızdır. Visual Studio 2005'e Silverlight 1.0 proje
şablonunu yüklemek için Silverlight 1.0 SDK ile beraber gelen "Project Template"
kurulumundan faydalanıyorduk. Maalesef Silverlight 1.0 SDK Visual Studio 2008'e
ile uyumlu proje şablonlarını yükleyecek şekilde hala yenilenmedi.
Aslına bakarsanız Expression Blend 2 December Preview'u da
incelediğimizde artık Silverlight 1.0 projeleri için proje dosyalarının
yaratılmadığını ve direk Visual Studio'daki "Open Web Site" menüsü gibi bir
klasör göstererek Silverlight 1.0 web siteleri yaratarak eski sitelerini
açabildiğimizi görüyoruz. Bu güzel bir gelişme çünkü çoğu zaman Silverlight
uygulamaları zaten var olan bir web sitesinin bir parçası olacaktır. Ayrı bir
proje olarak değerlendirmek çoğu durumda mümkün olmuyor.
Herşeye rağmen bir şekilde Visual Studio 2008 ile beraber de Silverlight 1.0
proje şablonlarını kullanabilmemiz gerekir. Bunun için bilgisayarınıza Visual
Studio 2005 Silverlight 1.0 proje şablonunu yükledikten sonra aşağıdaki konumda
yer alan ZIP dosyasını alarak
..\Documents\Visual Studio 2005\Templates\ProjectTemplates\Visual C#\Silverlight\SilverlightJSApplication.zip
aşağıdaki konuma kopyalamanız gerekiyor.
..\Documents\Visual Studio 2008\Templates\ProjectTemplates\Visual C#\Silverlight\SilverlightJSApplication.zip
Kopyalama işlemini tamamladıktan sonra Visual Studio 2008'i açtığınızda
aşağıdaki şekilde Silverlight projesi yaratma seçeneği ile karşılaşacaksınız.
 Visual Studio 2008 içerisinde Silverlight 1.0 Proje Şablonu
Bu sistemi kullanarak yarattığınız Silverlight 1.0 projeleri
ile beraber Visual Studio 2008 bir de Solution File
yaratacaktır. Bu dosyaları isterseniz Expression Blend 2 ile
açabilirsiniz veya yukarıda da bahsettiğim gibi direk "File / Open / Site"
menüsü ile klasörü açmayı deneyebilirsiniz.
Hepinize kolay gelsin.
Not:Visual Studio 2008 için Microsoft tarafından dağıtılan Silverlight Tools paketi Silverlight 2.0 sürümü içindir. Yukarıdaki bahsettiklerim 1.0 yani şu an yayında olan sürüm için geçerli.
Silverlight ile yaptığımız projelerde istemci tarafında eğer
Silverlight Plug-In yüklü değilse projemiz dahilinde
Silverlight.js dosyası otomatik olarak bir yükleme uyarısı çıkarıyor ve
kullanıcıyı gerekli yüklemeleri yapmak üzere Microsoft web sitelerine
yönlendiriyor. Bu durumun pek bir zararı yok gibi gözükse de aslında kullanıcıyı
başka bir web sitesine yönlendirmeden de bu işi halledebiliriz :)
 Standard bir Silverlight yükleme uyarısı.
Peki Microsoft web sitelerine yönlendirmeden doğrudan bir yüklemeyi nasıl
ayarlayabiliriz. Aslında durum gerçekten basit bir ayardan öteye geçmiyor.
properties: {
width: "100%",
height: "100%",
version: "1.0",
inplaceInstallPrompt: true
},
Silverlight uygulamamıza ait createSilverlight fonksiyonu içerisinde
belirlediğimiz parametreler arasında bir de inplaceInstallPrompt
parametresi ayarlıyoruz. Bu parametrenin değeri true olarak
ayarlandığında Silverlight yükleme uyarısı aşağıdaki şekilde ekrana gelecektir.
Söz konusu resme tıklandığında da direk yükleme işlemi başlayacaktır.
 Doğrudan yükleme yapan uyarı mesajı.
Hepinize kolay gelsin.
Silverlight uygulamaları hazırlarken Expression Blend'in 2.0 sürümünü
kullanmamız gerekirken maalesef 2.0 sürümünün hala Preview aşamasında olmasa
epey sıkıntı yaratıyor. Durum böyle olunca Preview'ların sürümlerini de yakından
takip etmek şart. Takriben her ay yeni bir Preview çıkıyor
zaten her bir Expression Blend 2 Preview sürümü de söz konusu
ayın ismi ile anılıyor. Şu an Expression Blend 2'nin December Preview
sürümünü hemen aşağıdaki adresten bilgisayarınıza indirebilirsiniz.
http://www.microsoft.com/expression/products/download.aspx?key=blend2preview
Özellikle Visual Studio 2008 ile proje dosyaları
uyumluluğunun gelmesi zaten beklediğimiz bir gelişmeydi. Diğer yandan
Silverlight tarafına baktığımızda da aslında Expression Blend 2 arayüzü epey bir
derlenip toparlanmış. WPF tarafında olup Silverlight tarafında desteklenmeyen
özelliklere ait panellerin program içerisinde Silverlight projelerinde gereksiz
yere gözükmesi engellenmiş. Böylece artık özellikle Silverlight seminerlerimde
"Programın bu bölümü burada gözüküyor fakat Silverlight ile çalışmıyor
sadece WPF'de var." demekten kurtuldum :)
Dün Galatasaray Üniversitesi'nde Bilişim Kulübü'nun
katkıları ile süper bir Silverlight semineri yaptık. Her
zamanki gibi tüm gün yoğun bir ders temposundan çıktıktan sonra ciddi bir
konsantrasyon performansı ile semineri sonuna kadar dinleyen tüm öğrenci
kardeşlerime çok teşekkür ediyorum. Seminerin sonunda çekilen aşağıdaki
fotoğraftan da anlaşılabileceği gibi epey eğlenceli dakikalar geçirdik :)
 Galatasaray Üniversitesi Silverlight Semineri
Organizasyonu düzenleyen Galatasaray Üniversitesi Bilişim Kulübüne
ve özellikle sevgili kardeşim MSP, Emre Çalışır'a buradan
teşekkür etmek istiyorum.
Sayfa içi Silverlight kullanımı özellikle Silverlight animasyonlarını ve
görsellerini oluşturan XAML kodunu sunucu tarafında oluşturuyorsanız belirli
senaryolarda işinizi kolaylaştırabilir. Örneğin bir ASP.NET Repeater içerisinde
ItemTemplate'ler ile XAML kodu oluşturmak bu konsept içerisinde mümkün.
Normal şartlarda bir Silverlight uygulaması createSilverlight fonksiyonundaki
Silverlight.createObjectEx metoduna verilen source
parametresinde yazan adresteki XAML kodunu alarak gerekli animasyonları
oluşturur. Source parametresi içerisinde aşağıdaki gibi
# işaret ile başlayarak bir kaynak belirttiğinizde Silverlight.createObjectEx
fonksiyonu sayfa içerisinde uygun bir XAML kaynağı
arayacak ve varsa gerekli yüklemeyi sağlayacaktır.
function createSilverlight()
{
var scene = new ITU2.Page();
Silverlight.createObjectEx({
source: "#CODE",
parentElement: document.getElementById("SilverlightControlHost"),
id: "SilverlightControl",
properties: {
width: "100%",
height: "100%",
version: "1.0"
},
events: {
onLoad: Silverlight.createDelegate(scene, scene.handleLoad)
}
});
}
Peki #CODE da nedir? Yukarıdaki gibi #CODE
dediğimizde Silverlight harici bir XAML dosyasına bakmak yerine createSilverlight
fonksiyonunun çalıştırıldığı sayfada ID bilgisi CODE olan bir
SCRIPT bloğu arayacak. Söz konusu SCRIPT bloğunun aşağıdaki
gibi TYPE özelliğinin de TEXT/XAML olması gerekir.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="Silverlight.js"></script>
<script type="text/javascript" src="Default_html.js"></script>
<script type="text/javascript" src="Page.xaml.js"></script>
<style type="text/css">
.silverlightHost {
height: 480px;
width: 640px;
}
</style>
</head>
<body>
<script
id="CODE"
type="text/xaml">
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="300" Height="300"
Background="White"
x:Name="Page"
>
<Rectangle Width="0" Height="2" Fill="#FFFB0000" Stroke="#FF000000" RadiusX="26.5" RadiusY="26.5" Canvas.Left="-113" Canvas.Top="166"/>
</Canvas>
</script>
<div id="SilverlightControlHost" class="silverlightHost">
<script type="text/javascript">
createSilverlight();
</script>
</div>
</body>
</html>
Yukarıdaki örnekte de görebildiğiniz üzere Silverlight uygulaması ile ilgili
tüm XAML kodu SCRIPT tagları arasına yerleştirilmiş durumda. Daha önceki adımda
JavaScript tarafında #CODE diyerek burada ID bilgisi
CODE olan bölümden gerekli XAML içeriğinin alınmasını sağladık.
Silverlight uygulamamız normal bir Silverlight animasyonu olarak çalışmaya devam
edecektir. Direk sayfa içerisinde bulunan bu XAML kodunu harici bir sayfa
yaratmadan Repeater gibi nesnelerle veritabanına bağlayarak kullanmamız bu
teknik ile çok daha kolaylaşıyor.
Hepinize kolay gelsin.
Seminer veya eğitimlerin faydalı olduğunu hissettiğimde ne kadar mutlu
olduğumu anlatamam :) Bugün İstanbul Teknik Üniversitesi'nde "Silverlight"
semineri düzenledik. Her zamanki gibi 3 saat süren mini bir maratondu. Maratonun
başındaki ilk bir buçuk saatin sonundaki mola sonrasında ortadan kaybolan :) bir
kısım katılımcının sonrasında ikinci bölümde "gerçek meraklı ve ilgili"
kesimle başbaşa kaldım. Herhalde o dakikadan sonra semineri 6 saate de uzatsam
devam edebilirdik :)
 İstanbul Teknik Üniversitesi Silverlight Semineri
Ben katılan herkese çok teşekkür ediyorum. 3 saatlik seminerler genelde
(özellikle yazılım alanında) alışık olunmayan bir durum ve bir de üzerine benim
eğitim tadındaki üslubum eklenince aslında epey ağır bir içerik bombardımanına
mağdur kalıyor katılımcılar. Üzerine bir de tüm bu katılımcı kardeşlerimin zaten
gün içindeki ağır ders temposundan çıktıklarını düşünürsek ilgilerini bu kadar
canlı tutarak beni dinlemeleri ciddi bir performans.
Organizasyonla ilgili yardımlarından dolayı sevgili kardeşim MSP,
Deniz Demir'e çok teşekkür ediyorum.
Dün İstanbul Üniversitesi'nde zevkli bir "Silverlight"
semineri düzenledik. Seminer boyunca Expression Blend 2 ile Silverlight 1.0 ve
2.0 uygulamaları hazırlamanın yollarını incelerken birkaç ufak JavaScript sorunu
haricinde :) pürüzsüz bir işleyiş sağlayabildik. Maalesef seminerde internet
bağlantım olmadığı için sadece adreslerini söylediğim fakat gösteremediğim bazı
sayfaların adreslerini tekrar buradan da paylaşmak istiyorum. Özellikle seminer
boyunca not alamayanlar için faydalı olacaktır.
http://www.silverlight.net
http://silverlight.net/Showcase/
http://silverlight.net/GetStarted/
http://www.microsoft.com/express/download/
Organizasyonla ilgili yardımlarından dolayı özellikle sevgili MSP, Hilmi Beydeş'e
teşekkür etmek istiyorum.
Türkiye'nin ilk içerik yönetim sistemli full Silverlight sitesi olma özelliğini taşıyan deveload.com artık Microsoft'un resmi Silverlight sitesinde "Showcase" bölümünde sergileniyor. Böylece "Türk Bayrağı"'nı dalgalandırma konusunda artık bizim de çorbada tuzumuz var.

Silverlight'ın en sevdiğim yanı görsel anlamdaki her şeyi XAML ile yani
özünde XML ile tanımlıyor olmamız. Böylece hali hazırda herhangi bir programlama
dili ile rahatlıkla Silverlight görsel animasyonlarını yaratmak mümkün oluyor.
Ben bu yazımda ASP.NET ile Silverlight XAML kodu yaratacağım. Yazının örnek
kodlarını çok uzatmamak ve mantığı sizlere iletebilmek adına sadece bir
dikdörtgen ve basit bir animasyon kullanacağım.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="640" Height="480"
Background="White"
x:Name="Page"
>
<Canvas.Resources>
<Storyboard x:Name="Animasyon">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="rectangle" Storyboard.TargetProperty="(UIElement.Opacity)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="1"/>
<SplineDoubleKeyFrame KeyTime="00:00:01" Value="0.1"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Canvas.Resources>
<Rectangle Width="300" Height="300" Fill="#FFFF0000" Stroke="#FF000000" Canvas.Left="65" Canvas.Top="89" RenderTransformOrigin="0.5,0.5" x:Name="rectangle"/>
</Canvas>
Yukarıda gördüğünüz XAML kodunu Expression Blend 2 ile
yarattığım Silverlight uygulamamdan aldım. Uygulamam içerisinde bir dikdörtgen
bulunuyor. Ayrıca Animasyon adında bir de StoryBoard
hazırlayarak dikdörtgenin şeffaflığını değiştirerek ufak bir animasyon yarattım.
Bu Silverlight uygulamasına ek olarak tabi ki animasyonu başlatacak olan
JavaScript kodlarının da haricen yazılması gerekiyor fakat bizim bu yazıda
amacımız işin görsel kısmını ASP.NET ile yaratacağımız XML kodları ile
oluşturuyor olmak olacak.
Oluşturmayı hedeflediğimiz XAML kodu önümüzde olduğuna göre
hemen örnek bir ASP.NET Web Sitesi yaratarak Page_load durumuna
kodlarımızı yazmaya başlayalım. Unutmayın ki amacımız sayfamızın geriye HTML
değil XAML kodları döndürmesini sağlamak. Böylece bu kodları alarak JavaScript
ile Silverlight uygulamasına çevirebileceğiz.
Response.ContentType = "text/xml"
Response.Clear()
Yukarıdaki kod ile içerisinde bulunduğumuz ASP.NET sayfasının artık bir HTML
değil XML kodu döndüreceğini belirlemiş oluyoruz sonrasında da sayfanın
içeriğini başlangıçta güzelce bir temizliyoruz :) Bir sonraki satırda XAML
kodlarımızı yaratmak üzere bir XmlTextWriter nesnesi
tanımlayarak nesnenin çıktı vereceği Stream olarak da
Response'u yani sayfamızın kaynağını belirteceğiz.
Dim Dosya As New System.Xml.XmlTextWriter(Response.Output)
Tüm bunları yaptığımıza göre artık bizi klasik bir XML dosyası yaratma
prosedürü bekliyor. İlk olarak yaratmamız gereken XAML kodumuzun RootElement'i
olan Canvas nesnesi.
Dosya.WriteStartElement("Canvas")
Dosya.WriteStartAttribute("x", "Page", "http://schemas.microsoft.com/winfx/2006/xaml")
Dosya.WriteString("sadasd")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("xmlns")
Dosya.WriteString("http://schemas.microsoft.com/client/2007")
Dosya.WriteEndAttribute()
Canvas'ımızı yaratırken XAML'e özel XML NameSpace'lerini de tabi ki
tanımlamamız şart. Sıra artık yukarıdaki şekliyle tüm XML elementlerini,
özelliklerini ve değerlerini tek tek yaratmaya geldi. Yazımın başındaki XAML
dosyasını yaratan kodun tamamını aşağıda bulabilirsiniz.
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Response.ContentType = "text/xml"
Response.Clear()
Dim Dosya As New System.Xml.XmlTextWriter(Response.Output)
'CANVAS GELİYOR
Dosya.WriteStartElement("Canvas")
Dosya.WriteStartAttribute("x", "Page", "http://schemas.microsoft.com/winfx/2006/xaml")
Dosya.WriteString("sadasd")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("xmlns")
Dosya.WriteString("http://schemas.microsoft.com/client/2007")
Dosya.WriteEndAttribute()
'RESSOURCES GELİYOR
Dosya.WriteStartElement("Canvas.Resources")
Dosya.WriteStartElement("Storyboard")
Dosya.WriteStartAttribute("x", "Name", "http://schemas.microsoft.com/winfx/2006/xaml")
Dosya.WriteString("Animasyon")
Dosya.WriteEndAttribute()
Dosya.WriteStartElement("DoubleAnimationUsingKeyFrames")
Dosya.WriteStartAttribute("BeginTime")
Dosya.WriteString("00:00:00")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Storyboard.TargetName")
Dosya.WriteString("rectangle")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Storyboard.TargetProperty")
Dosya.WriteString("(UIElement.Opacity)")
Dosya.WriteEndAttribute()
Dosya.WriteStartElement("SplineDoubleKeyFrame")
Dosya.WriteStartAttribute("KeyTime")
Dosya.WriteString("00:00:00")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Value")
Dosya.WriteString("1")
Dosya.WriteEndAttribute()
Dosya.WriteEndElement()
Dosya.WriteStartElement("SplineDoubleKeyFrame")
Dosya.WriteStartAttribute("KeyTime")
Dosya.WriteString("00:00:01")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Value")
Dosya.WriteString("0.1")
Dosya.WriteEndAttribute()
Dosya.WriteEndElement()
Dosya.WriteEndElement()
Dosya.WriteEndElement()
Dosya.WriteEndElement()
'RESSOURCES BİTTİ
'DİKDÖRTGEN GELİYOR
Dosya.WriteStartElement("Rectangle")
Dosya.WriteStartAttribute("Height")
Dosya.WriteString("300")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Width")
Dosya.WriteString("300")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Fill")
Dosya.WriteString("#FFFF0000")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Stroke")
Dosya.WriteString("#FF000000")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Canvas.Left")
Dosya.WriteString("65")
Dosya.WriteEndAttribute()
Dosya.WriteStartAttribute("Canvas.Top")
Dosya.WriteString("89")
Dosya.WriteEndAttribute()
Dosya.WriteEndElement()
'DİKDÖRTGEN BİTTİ
Dosya.WriteEndElement()
'CANVAS BİTTİ
Dosya.Flush()
Dosya.Close()
Response.End()
End Sub
Kodun epey uzun olduğunun farkındayım. Fakat yukarıdaki kodu böyle elle tek
tek yazdığımızı değil de :) herhangi bir veritabanına bağlıyken döngüler
içerisinde çalıştırdığımızı düşünürseniz aslında işin ne kadar da kolay
olabileceğini anlamış olursunuz. Bu teknik ile veritabanına bağlı gerçek zamanlı
olarak vektörel animasyonlar yaratmak çocuk oyuncağı oluyor.
Özellikle kodun son satırlarındaki Response.End() komutunu yazmayı unutmayın.
Aksi halde sayfanızın kaynağındaki HTML kodları da istemciye gider ve XAML
dosyanızın yapısı bozulmuş olur.
Sayfamızı hazırladığımıza göre artık sıra geldi bu XAML'i bir Silverlight
projesinde kullanmaya. Yeni bir Silverlight projesi yaratarak gerekli tüm
JavaScript komutlarını ASP.NET sayfanıza veya herhangi bir web sitesine
aktardıktan sonra tek yapmanız gereken createSilverlight
JavaScript fonksiyonunuz içerisindeki source özelliğini
değiştirerek XAML çıktısı veren sayfanızın adresini yazmak.
function createSilverlight()
{
var scene = new UntitledProject50.Page();
Silverlight.createObjectEx({
source: "default.aspx",
parentElement: document.getElementById("SilverlightControlHost"),
id: "SilverlightControl",
properties: {
width: "100%",
height: "100%",
version: "1.0"
},
events: {
onLoad: Silverlight.createDelegate(scene, scene.handleLoad)
}
});
}
Unutmayın! :) Source özelliğine yabancı bir domainden kaynak
belirtemezsiniz. Kaynak ASPX sayfası ile Silverlight animasyonunuzun
yayınlanacağı sayfanın aynı olması gerekiyor.
Hepinize kolay gelsin.
PCnet'in
Aralık sayısı yine dopdolu :) Derginin
OKUL bölümünde AJAX, Silverlight,
Expression Web, Expression Blend, Expression Media ve Expression Design ile ilgili
yazılarım yer alıyor. Ayrıca Aralık sayısından itibaren dünyada ilk defa :) ASP.NET 3.5
bölümü PCnet'te!
ASP.NET 3.5 : ASP.NET 3.5 Geliyor!
AJAX : UpdatePanel uzmanlığı
Silverlight : Kolay Yoldan Silverlight Animasyonları
Expression Blend : MediaElement ile Video Sihirleri
Expression Web: Expression Web ile yolculuğa devam
Expression Design : İlk Windows Programımızı Tasarlayalım
Expression Media : Mültimedya Dosya Yönetimi
Tüm bu yazılara ek olarak Aralık sayısına özel sürpriz makalem :)
Yeni nesil MashUP uygulamaları :
MashUp uygulamaları hazırlamanın zevki Microsoft Popfly ile kat kat arttı.
Hepsi PCnet Aralık sayısında! :)
Daha fazlasını mı istiyorsunuz? PCnet ile beraber Expression Studio paketinden Blend, Web, Design, Encoder, Media'nın deneme sürümleri de DVD olarak geliyor.
Hepinize kolay gelsin.
Bolca Silverlight 1.0 uygulamaları hazırladığımız :) bugünlerde maalesef Silverlight 1.0 ile beraber gelen hazır kontrollerin azlığı yüzünden biraz zorluk çekiyoruz. Bu durum Silverlight'ın bir sonraki sürümünde düzeliyor olacak fakat biz o zamana kadar uygulamalarımızda
HTML kontrolleri ile idare etmek durumundayız. Peki nasıl olur da bir
Silverlight uygulamasında HTML kontrollerini kullanırız?
Esasen çözüm özünde çok basit. Silverlight'ın programlamasını ne de olsa
sayfamızdaki JavaScript ile yapıyoruz. Aynı JavaScript aslında sayfadaki diğer
HTML kontrollerine de ulaşabilme olanağına sahip. Yani hem Silverlight hem de
HTML nesnelerine aynı anda aynı kod ile ulaşabiliriz. Bu durumda geriye sadece
bir tek soru kalıyor;
HTML kontrollerini Silverlight animasyonlarının üzerine nasıl
yerleştiririz?
İlk olarak ufak bir Silverlight animasyonu hazırlayarak sayfanıza
yerleştirin. Sonrasında hemen gidip createSilverlight
metodunuzu bularak içerisinde aşağıdaki değişikliği yapın. Eğer projenizi
Expression Blend 2 ile yarattıysanız createSilverlight
fonksiyonu default_html.js dosyası içerisinde yer alacaktır.
function createSilverlight()
{
var scene = new DEVELOAD_SV.Page();
Silverlight.createObjectEx({
source: "Page.xaml",
parentElement: document.getElementById("BirHost"),
id: "BirHost",
properties: {
width: "100%",
height: "100%",
version: "1.0",
isWindowless: "True"
},
events: {
onLoad: Silverlight.createDelegate(scene, scene.handleLoad)
}
});
}
Özellikle kalın olarak yazdığım satıra dikkat etmenizde fayda var.
Silverlight animasyon nesnemize ait isWindowless özelliğini
True olarak ayarladığımızda artık bir sonraki adıma geçmek için
hazırız demektir. Aslında bundan sonrası tamamen HTML ve
CSS bilgisi ile alakalı.
<div id="BirHost">
<script type="text/javascript">
createSilverlight();
</script>
<div class="container1">
</div>
</div>
Yukarıda gördüğünüz HTML kodu Silverlight animasyonumuzun gösterileceği
sayfada yer alıyor. Hali hazırda zaten Silverlight uygulamamız için bir Host
element olarak BirHost elementi ayarlanmış durumda. Bir önceki
bölümde createSilverlight fonksiyonumuz içerisinde de
BirHost elementini parentElement olarak ayarlamıştık.
Normalden farklı olarak bu sefer kodumuzda, BirHost elementi
içerisinde başka bir DIV elementi daha yer alıyor. İşte bu DIV elementi bizim
HTML kontrollerimizi koyacağımız yer. Önemli olan söz konusu DIV elementine
doğru CSS özelliklerini aktararak Silverlight uygulamasının
önünde gözükmesini sağlamak.
.container1
{
height:300px;
z-index:1;
position:absolute;
top:230px;
left:0px;
width:100%;
}
Yukarıdaki CSS sınıfı içerisinde özellikle kalın yazılı satırlar çok önemli.
z-index CSS özelliğini 1 olarak ayarlayarak
söz konusu DIV elementinin bir katman öne gelmesini ve Silverlight uygulamasının
önünde gözükmesini sağlıyoruz. Sonrasında position özelliğini
de absolute tanımlayarak DIV elementini ekranda istediğimiz
yere konumlandırabiliyoruz. Artık DIV elementimiz Silverlight
uygulamamızın önünde gözükecek.
DIV elementinin içine istediğiniz HTML nesnelerini yerleştirebilirsiniz ve
söz konusu HTML elementlerinin onclick gibi eskiden de
kullandığımız eventlarına farklı JavaScript fonksiyonları aktararak yine bu
fonksiyonlar içerisinde Silverlight animasyonunuzdaki nesnelere de .findName
metodu ile ulaşabilirsiniz. Aslında bu noktada ister HTML elementlerini
yakalamak olsun ister Silverlight nesnelerini, bugüne kadar yaptıklarımızdan
herhangi bir farklılık söz konusu değil. Esas mesele HTML nesnelerini "Overlay"
olarak Silverlight animasyonunun önüne koyabilmekti :)
Hepinize kolay gelsin.
Visual Studio 2008'in çıkması ile artık eski Silverlight 1.1 Tools paketini kullanma şansınız yok. Visual Studio 2008 Beta 2 ile beraber çalışabilen paket Visual Studio 2008'in RTM sürümüne göre tekrar hazırlandı. Aşağıdaki adresten paketi bilgisayarınıza indirebilirsiniz. Fakat unutmayın ki tüm bu paketler ve Silverlight hala Alpha aşamasında ve release olmamış durumda. Benim tavsiyem kesinlikle sanal makine kullanmanız. Özellikle hali hazırda Silverlight 1.0 projeleri üzerine çalışıyorsanız sisteminizde Silverlight 1.1 Plug'In'in yüklü olması bazen yüklü olmayan sistemlere kıyasla Silverlight 1.0 projelerinde farklı hatalarla karşılaşmanıze veya daha da kötüsü "karşılaşmamanıza" neden olabiliyor.
http://www.microsoft.com/downloads/details.aspx?FamilyId=25144C27-6514-4AD4-8BCB-E2E051416E03&displaylang=en
Kolay gelsin.
Biraz önce mail ile süper bir soru aldım :) Soru şöyle: "Silverlight
içerisinde font dahil edip istemci tarafında kullanma şansımız var mı?" EVEEEET
:) Var. Silverlight uygulamanızdaki herhangi bir TextBlock'un
setFontSource metodunu kullanarak sadece Silverlight
animasyonunun çalıştığı istemci makinedeki fontları değil harici font
kaynaklarını kullanmasını da sağlayabilirsiniz. Peki bunu nasıl yapacağız?
İlk olarak kullanacağımız fontu tabi ki sunucumuza yerleştirmemiz gerekiyor.
Sonrasında Silverlight uygulamamız istemcide yüklendiği anda fontu da yüklemeye
başlamamız lazım. Bunun için bir Silverlight downloader nesnesi
yaratarak kullanacağız. Aşağıdaki gibi bir kod işimizi görecektir.
if (!window.Font_SV)
window.Font_SV = {};
Font_SV.Page = function()
{
}
Font_SV.Page.prototype =
{
handleLoad: function(control, userContext, rootElement)
{
var
yukleyici = document.getElementById('SilverlightControl').createObject("downloader");
yukleyici.addEventListener("Completed",
Tamamlandi);
yukleyici.open("GET", "Dungeon.TTF");
yukleyici.send();
}
}
Gelin satır satır yukarıdaki kodu inceleyelim. İlk satırda adını
yukleyici olarak verdiğim bir JavaScript değişkenine download nesnesi
yaratıyorum. Bunun için sayfamdaki Silverlight uygulamamın ID bilgisini document.getElementById
metoduna vererek Silverlight uygulamamı yakaladıktan sonra uygulamama ait
createObject metodunu kullanıyorum. Söz konusu metodu obje tipi
olarak downloader değerini vermem yeterli oluyor. Artık
elimizde bir downloader nesnesi bulunduğuna göre gelelim bu
nesnenin ayarlarına.
İkinci satırda hemen downloader nesnesine sunucudan veriyi
istemciye asenkron olarak yükleme işini bitirdiğinde çalıştırılmak üzere
Tamamlandi adinda bir JavaScript fonksiyonu aktarıyorum. Bu fonksiyonu
biraz yazacağız.
Üçüncü satırda downloader nesnesini aynı bir XMLHttpRequest
nesnesi gibi sunucudan veri isteme metodunu ve isteyeceği dosyayı ayarlıyorum.
GET metodu şimdilik uygun. Dosya adı olarak da benim örneğimde Dungeon.TTF
font dosyamın adı. Bu noktada özellikle belirtmem gereken bir nokta var. Yine
aynı XMLHttpRequest nesnelerinde de olduğu gibi downloader
nesnesi de ancak URL üzerinden dosya çekebiliyor. Yani bu kodları makinenizde
çalıştırırken de IIS veya ASP.NET Development Server üzerinden çalıştırmanız
gerekecek.
Son olarak dördüncü satırda artık tüm ayarlarım tamamlandığı için veri alım
işlemini başlatmak üzere talebimi yukleyici'nin send
metodu ile sunucuya gönderiyorum.
Peki veri geldiğinde neler yapacağız? Gelin şimdi de aşağıdaki kodu
inceleyelim.
function Tamamlandi(sender, eventArgs)
{
sender.findName("Metin").setFontSource(sender);
sender.findName("Metin").fontFamily = "TrSah Dungeon";
sender.findName("Metin").text = "Bu artık çok özel bir fontla yazılmış bir metin!!!";
}
Tamamlandi adındaki fonksiyonum çalıştırıldığında hemen
Silverlight uygulamamdaki Metin ID'li TextBlock nesnemi
yakalıyorum. Sonrasında TextBlock nesnesine ait setFontSource
metoduna parametre olarak diren sender parametresini veriyorum.
Yine aynı karşılaştırmayı yaparak sizlere XMLHttpRequest nesnelerini hatırlatmak
isteyorum. XMLHttpRequest nesneleri ile AJAX uygulamalarında da
sunucudan asenkron isteklerde bulunduğumuzda isteğimiz tamamlandığında
çalıştırılan fonksiyonumuza gelen ilk parametre aslında sunucudan gelen verinin
ta kendisi oluyordu. Burada da durum aynı. Bizim Tamamlandi
fonksiyonumuzun sender parametresi downloader
tarafından gönderilen ve sunucudan gelen font dosyamızın verisi.
Gelen veriyi TextBlock nesnemizin font kaynaklarına ekledikten sonra sıra
geldi söz konusu fontu TextBlock için gösterim aşamasında
seçmeye. Bunun için TextBlock'a ait fontFamily
özelliğini yüklediğimiz fontun adı ile değiştiriyoruz. Son olarak da
TextBlock içerisinde metni içerisinde Türkçe karakterler de olan bir
metin ile değiştiriyorum. En ufak bir sorun yok :)
Biraz daha kullanıcı dostu bir yükleme süreci için isterseniz siz
uygulamalarınızda yükleme işlemini başlatmadan önce ekranda "Yükleniyor" gibi
bir uyarı mesajı da gösterebilirsiniz.
Örnek uygulamayı aşağıdaki adreste inceleyebilirsiniz. Kaynak kodlarını
özellikle bir paket olarak koymuyorum. İsteyenler sayfanın kaynak kodlarına
girerek zaten alabilirler :) Sizler için de biraz Silverlight egzersizi olmuş
olur.
http://daron.yondem.com/samples/font_embed/
Kolay gelsin.
Silverlight 1.0'a ait SDK paketi yenilendi. Hemen aşağıdaki adresten bilgisayarınıza indirerek yükleyebilirsiniz. Özellikle hali hazırda Expression Blend 2 ve harici JavaScript editörleri ile Silverlight 1.0 projeleri yürütmekte olanlarla tavsiye ederim. Eski 1.0 SDK paketini yükleyenlerin yenilemelerine gerek yok :) Malum eskisinde zaten Intellisens ve Project Template gibi şeyleri ayrı ayrı yükledik.
Silverlight 1.0 SDK
Dün akşam son dersimizle beraber KoçAllianz IT ekibiyle
Silverlight safarimizi noktaladık :) Özellikle "safari" olarak adlandırıyorum çünkü Beta yazılımlarla epey tehlikeliydi yolculuk. Eğitim başında Expression Studio'yu inceledikten sonra hemen Silverlight 1.0 dünyasına geçiş yaparak biraz da AJAX'a göz attık.

Eğitimimizi sonlandırmadan önce son günümüzde ufak bir de proje
gerçekleştirdik. Sınıfımızda hem tasarımcı arkadaşlar hem de programcılar olduğu
için Expression Studio ve Visual Studio konseptine uygun olarak tasarımcılar ve
programcılar aynı anda proje üzerinde çalışabildiler. Sonuçta ortaya ne mi
çıktı?
http://daron.yondem.com/samples/kocallianz/default.htm
Yukarıdaki adresten ziyaret edebileceğiniz site içerisinde bir video paylaşım
sitesi bulunuyor. Sitenin sol tarafındaki videoların listesi, açıklamaları ve
dosyaların konumları AJAX ile SQL2005 üzerinden çekiliyor. Projeye ders
içerisinde çok fazla zaman ayıramadığımız için tabi ki eksikler var, özellikle
videolar için loader koyacak zamanımız olmadı ben de bu nedenle videoların
kalitelerini düşürdüm. Fakat genel olarak baktığımızda eskiden yapamayacağımız
çok sayıda şeyi hızlı bir şekilde yapabildiğimizi görüyoruz. Örneğimizin
tasarımı ilk aşamada Expression Design ile yapıldı. Sonrasında Expression Blend
2'ye alınarak animasyon hazırlandı. ASP.NET AJAX web sitesi ve veri katmanı
Visual Studio 2005 içerisinde programlandı ve şimdilik JavaScript kodlarını da
daha önceki yazılarımda bahsettiğim Aptana ile yazdık.
Projenin tüm kodlarını aşağıdaki adresten bilgisayarınıza indirebilirsiniz.
KoçAllianz Örnek Proje Kodları - 17112007_2.rar (404.13 KB)
Organizasyon için KoçSistem ve
Arıbil yetkililerine ve tüm katılımcılara teşekkür ediyorum.
Visual Studio 2008'e adım adım yaklaştığımız şu günlerde belki de biraz geç
bir yazı yazıyorum. İster AJAX ister Silverlight uygulamalarında olsun artık
JavaScript kodu yazmayan veya yazamayan bir "web developer" şu an düşünülemez.
Bu noktada daha önceki yazılarımda da bahsettiğim üzere Intellisense desteği VS
2008 ile beraber geliyor fakat VS2008'in resmi lansmanı Şubat'ta yapılacak. Daha
acil bir çözüme ihtiyaç duyanlara ücretsiz bir alternatif tavsiyesinde
bulunacağım.
Aptana Community Edition!
Aptana'nın aslında ücretli olan bir sürümü var. Ama biz sadece JavaScript
editörü olarak kullanacağımız için bize ücretsiz olan Community Edition
yeter de artar bile. Programı hemen aşağıdaki adresten indirebilirsiniz.
http://www.aptana.com/download/#windows
 Aptana içerisindeki zengin JavaScript Intellisense desteği.
Aptana sayesinde artık sadece bir noktalı virgül eksiği yüzünden çalışmayan
JavaScript dosyalarınıza saatlerce bakıp da hatayı bulamama durumundan
kurtulabilirsiniz. Ayrıca Intellisense desteği ciddi kolaylık sağlıyor.
Yukarıdaki ekran görüntüsünde de görebileceğiniz üzere Cross-Browser JavaScript
kodu yazabilmeniz için tüm JavaScript sınıf ve metodlarının hangi tarayıcılar
ile uyumlu olduğuna ait bilgiler de direk Intellisense ile beraber ekrana
geliyor. Sıkıştığınız durumlarda gerçekten yardımcı olabilecek bir araç olarak
bilgisayarlarınızda kurulu bulundurmanızda fayda var.
Daha önceki blog yazılarımdan
birinde Türkiye'nin ilk kurumsal Silverlight
uygulaması olarak DEVELOAD Yazılım'a ait
web sitesini sizlerin beğeninize
sunmuştum. O zamanlar pek önemsemediğimiz için sitenin FireFox ile uyumlu olup
olmaması konusunda bir çalışma yapmamıştık. Açıkçası hala pek önemsemiyoruz
çünkü hem uluslararası çalışmalardan hem de yurt içi sitelerden aldığımız
istatistiklerde hala FireFox'un yaygınlığı %5'i bulamadı. Neyse biz konumuza
dönelim.
O tarihlerden beridir Silverlight'ın kullanımı ile ilgili yerli bir örnek
vermem gerektiğinde www.deveload.com'u
veriyorum. Tabi ki bunu reklam olması amacıyla yapmıyorum :) DEVELOAD tarafında
sitemizi Silverlight ile yenilerken amacımız Silverlight olmadan önce Flash ile
yaptığımız tarz uygulamaların tıpatıp aynılarının Silverlight ile de başarılı
ve kolay bir şekilde yapılabildiğini göstermekti. Fakat her yaptığım demoda önce
Silverlight'ın cross-browser olduğundan bahsedip sonra da cross-browser olmayan
bir örnek göstermek her tür açıklamama rağmen biraz komik oluyordu :) Malum söz
konusu sitenin FireFox uyumsuz olması tamamen bizim yazdığımız kodlardan
kaynaklanıyordu (öyle sanıyorduk) Silverlight'ın kendisinden değil.
Sözün özü, biraz önce bu konuya el atarak acaba nedir bu kodların FireFox'da
çalışmamasının nedeni diyerek ufak bir çalışmaya giriştim ve tabi ki sorunu
buldum.
Sorun maalesef yazdığımız JavaScript kodları ile alakalı değil :) Silverlight
ile ilgiliymiş :) Site içerisinde genel olarak kullanılan 100% genişlikte ve
100% yükseklikte bir Silverlight animasyonu var. Bu animasyonun üzerine bir
katman (DIV) yerleştirilerek ekstra içerik gösteriliyor. Silverlight
animasyonunun genişliğinin ve yüksekliğinin 100% olması için animasyona
aşağıdaki parametreleri vermişiz.
function createSilverlight()
{
var scene = new DEVELOAD_SV.Page();
Silverlight.createObjectEx({
source: "Page.xaml",
parentElement: document.getElementById("DEVELOAD_Host"),
id: "DEVELOAD_Host",
properties: {
width:
"100%",
height:
"100%",
version: "1.0",
isWindowless: "True"
},
events: {
onLoad: Silverlight.createDelegate(scene, scene.handleLoad)
}
});
}
Maalesef Silverlight animasyonu ile ilgili verilen bu parametrelerdeki
değerler eğer yüzde üzerinden verilmiş ise FireFox'da herhangi bir görüntü
alamıyorsunuz. Internet Explorer içerisinde ise hiçbir sorun yok. Aslında bu
sorun FireFox içerisinde normal HTML elementlerinde de var ve çözüm olarak
sayfadaki HTML ve BODY taglarına da aynı CSS özelliklerini vermek yeterli
oluyor. Fakat Silverlight için bu da yeterli değil. Çok daha farklı bir çözüm
gerekiyor.
DEVELOAD_SV.Page.prototype =
{
handleLoad: function(control, userContext, rootElement)
{
if (window.innerHeight)
{
$get('DEVELOAD_Host').style.height = window.innerHeight + "px";
}
}
}
Yukarıdaki koddan da anlaşılacağı gibi Silverlight animasyonu yüklenir
yüklenmez bir boyutlandırma işlemi başlatıyoruz. Sorun tamamen animasyonun
boyutunun tanımlanamaması ile alakalı. FireFox içerisinde animasyon yükleniyor
ve Silverlight çalışıyor fakat yüzde olarak verilen genişlik ve yükseklik
değerleri geçersiz olduğu için ekranda gözükmüyor. Bu nedenle animasyon
yüklendiğinde çalıştırılan handleLoad fonksiyonu içerisinde ilk
olarak window.innerHeight diye bir özelliğin olup olmadığını
kontrol ederek FireFox gibi bir tarayıcıda olup olmadığımızı anladıktan sonra
gerekiyorsa Silverlight nesnesini yakalayarak yüksekliğini pencerenin
yüksekliğine eşitliyoruz. Aynı şekilde genişliğini de düzenleyebilirsiniz.
Böylece animasyonunuz ekrana tamamen yayılacaktır.
Hepinize kolay gelsin ;)
Bugün Microsoft Kurumsal Webiner serisinin ilk webinerini "Silverlight
ve ASP.NET AJAX ile Uygulama Geliştirme" konusunda gerçekleştirdik.
Duyuruların yavaş yavaş yayılıyor olmasının yanı sıra ilk webinerde 80 kişilik
bir katılım ile güzel bir aktivite oldu.
Webinerin mini sunumunu :) ve demoya ait kaynak kodları aşağıdaki adresten
indirebilirsiniz.
Webiner Sunum ve Demo Kaynak Kodları - 07112007_1.zip (467.18 KB)
Webiner sonrası gelen soruları ve cevaplarımı buradan paylaşmak istiyorum.
Umarım faydalı olur.
Soru:
Visual Studio 2008'e bu bu designer (Expression Blend) bağlı gelecek mi?
Cevap:
Visual Studio 2008'de JavaScript Intellisense desteği gelecek. Design kısmı şu
anki ile aynı. Designer olarak Expression Blend 2'yi ayrı bir program olarak
kullanmanız gerekecek.
Soru:
Expression Studio, Blend, Design, Web olsun tamamen Visual Studio'yu görsel
tasarım açısından desteklemek üzere çıkarılmış bir platform mudur? Ve bunlarda
yapabileceklerimiz sadece görsel tasarımdan mı ibarettir? Kod yazamıyor muyuz?
Cevap:
Expression serisi aynen bahsettiğiniz gibi tasarımcılara yöneliktir. Kod yazmak
için Visual Studio kullanmak şart. Kolay gelsin.
Soru:
Bu Expression Designer 2008'de de bu şekilde mi kullanılacak yoksa daha entegre
olacak mı?
Cevap:
Expression Blend 2 içerisindeki projeler direk VS 2008 ile de açılabiliyor.
Solution Explorer içerisind e herhangi bir dosyaya sağ tuş tıklayınca "Edin in
VS 2008" opsiyonu var.
Soru:
2008 ne zaman RTM olacak?
Cevap:
Bu ay sonu tahmin edilen süre :)
Soru:
Animasyon ve benzeri şeyleri eklerken JavaScript kısmı bu kadar manüel olacak mı
2008'de de ?
Cevap:
Intellisense desteği gelecek. Bu kadar manüel değil :) AJAX ile ilgili de çok
hoş JavaScript Intellisense destekleri yolda.
Soru:
Peki teşekkür ederim :)
Cevap:
ben teşekkür ederim ;) iyi çalışmalar
Soru:
Silverlight hiç bilmiyorum. Sorularım biraz saçma kalabilir. XAML'i
değiştirdiğimiz anda mı içerik değişiyor yoksa bekleme süresi var mı? Kendi
içinde her hangi bir event işlemi sırasında kendi okuduğu XAML'i
değiştirebiliyor muyuz? Değiştirebiliyorsak değiştirdiğimiz anda aynı şekilde
işlemine devam ediyor mu?
Cevap:
XAML'i değiştirdiğiniz anda sayfayı veya Silverlight animasyon nesnesini baştan
yüklemeniz gerekir. Başka bir seçenek olarak arka planda asenkron XAML
yükleyerek animasyonu aktarabilirsiniz. Herhangi bir event da XAML ile nesne
ekleyip çıkarabiliyorsunuz. XAML'de değişiklik olunca kaynaktan tekrar
yükleyerek sayfaya yansıtmanız gerek.
Katılan herkese teşekkürler. Hepinize kolay gelsin.
Nerden çıktı Silverlight 1.1? Aslına bakarsanız Silverlight 1.1 üzerine uzun
bir süre makale yazmayı düşünmüyordum. Bunun nedeni daha Silverlight 1.1'in
Alpha aşamasında olması. Yani şu anki yazılım, teknoloji ile yayınlanacak
Silverlight 1.1 arasında dağlar kadar farklar olabilir (hatta olacaktır). O
nedenle hali hazırda elimizdeki değerli zamanımızı ağırlıklı olarak Silverlight
1.0 ile tüketmek özellikle kurumsal projeler için çok daha mantıklı. Diğer
yandan Silverlight 1.1 ile geliştirdiğimiz bir uygulamayı çalıştırmaları için
istemcilere yine Alpha aşamasında Silverlight 1.1 Plug-In'ini yüklemelerini de
isteyemeyiz. Gerçeği söylemek gerekirse ben orijinal makineme hiçbir zaman Beta
ve Alpha yazılım kurmam, bu tarz denemeler için sanal makine kullanırım.
Silverlight 1.1 ile 1.0 sürümü arasındaki en büyük fark programlama kısmında.
Silverlight 1.0'da JavaScript ile istemci taraflı programlama yapabiliyorken
Silverlight 1.1 sürümünde .NET dillerini de kullanma şansımız var. Yazdığımız
kod bir DLL'e çevrilerek yine istemci tarafında Silverlight 1.1 Plug-In ile
çalıştırılıyor. Tabi bu noktada tüm .NET Framework Silverlight 1.1'e aktarılmış
durumda değil. Klasik .NET Framework 30MB gibi bir boyuta sahipken Silverlight
1.1 Plug-In sadece 3MB. Yani özetle .NET Framework'ün bir kısmı aktarılmış
durumda, tamamı değil.
Farkındaysanız hala neden bu makaleyi yazdığımı açıklamadım :) Blogumu takip
eden dostlarım tarafından bana bir çok soru maili geliyor. Bu soruların
bazılarını cevaplarken "Aslından bunu bir makale haline getirsem herkes
faydalanır" diyerek anından bir blogpost'a çeviriyorum. İşte bu makale de
böyle bir makale :) Aslında bana gelen maillerden birince cevap olarak yazılması
gereken bir çözüm, ama ben buradan paylaşarak herkesin okumasına olanak tanımak
istiyorum. Arkadaşımız çözümü C# olarak istemiş, o nedenle bu makaleye özgü
olarak C# kullanacağım. Ama lütfen bu bir gelenek haline gelmesin :) arkadaşlar
.NET geliştiriciler olarak hem C# hem VB kodunu okumayı öğrenmekte fayda var.
Özellikle VB kodunu okumak zaten kolay :) Böylece bana da C# yazdırmış
olmazsınız :) Haz etmediğim açıkça ortada sanırım ;)
Son olarak sorulara geçmeden önce kullandığım geliştirme ortamından da
bahsetmek istiyorum. Örnekleri yaparken
Visual Studio 2008 Beta 2 Professional Edition ve
Expression Blend 2 September Preview kullandım. Sistemimde Plug-In olarak
Silverlight 1.1 Alpha September Refresh yüklüydü.
Gelen sorulara bakalım :)
Silverlight 1.1 tarafında animasyonlara .NET kodu ile nasıl müdahale
ederiz?
Bunun için ilk olarak bir animasyon hazırlamamız gerekiyor. Aşağıdaki şekilde
bir animasyonu Silverlight sayfamızda Resource olarak tanımlayalım.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="parentCanvas"
Loaded="Page_Loaded"
x:Class="SilverlightProject14.Page;assembly=ClientBin/SilverlightProject14.dll"
Width="640"
Height="480"
Background="White"
>
<Canvas.Resources>
<Storyboard x:Name="Timeline1">
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:01" Value="209"/>
</DoubleAnimationUsingKeyFrames>
<DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
<SplineDoubleKeyFrame KeyTime="00:00:00" Value="0"/>
<SplineDoubleKeyFrame KeyTime="00:00:01" Value="29"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</Canvas.Resources>
<Ellipse Width="123" Height="119" Fill="#FFFF0000" Stroke="#FF000000" Canvas.Left="71" Canvas.Top="116" x:Name="ellipse" RenderTransformOrigin="0.5,0.5">
<Ellipse.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Ellipse.RenderTransform>
</Ellipse>
</Canvas>
Yukarıdaki kod içerisinde basit bir Ellipse nesnesinin
ekrandaki yeri değiştiriliyor. Yarattığımız StoryBoard'un adı
Timeline1 şeklinde bırakılmış. Şimdi istediğimiz şey Ellipse'in
kendisine tıklandığında animasyonun başlatılması. Yazacağımız kod tam olarak
aşağıdaki şekilde olacak.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverlightProject16
{
public partial class Page : Canvas
{
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
ellipse.MouseLeftButtonDown += new MouseEventHandler(ellipse_MouseLeftButtonDown);
}
void ellipse_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
Timeline1.Begin();
}
}
}
Gördüğünüz gibi ilk olarak Page.Loaded durumunda sayfamızda
yer alan ellipse nesnesinin MouseLeftButtonDown
durumuna bir Handler bağlıyoruz. Sonrasında da söz konusu handler
içerisinde Timeline1 nesnemizin begin()
metodunu çalıştırarak animasyonu başlatabiliyoruz. Bu kodu eğer VB.NET koduna
çevirecek olursak aradaki tek fark özel olarak Handler
tanımlamak yerinde VB.NET'teki Handles deyimini kullanarak işi
halledebiliyor olmamız. VB.NET kodunu da koymadan edemeyeceğim sanırım :)
Partial Public Class Page
Inherits Canvas
Public Sub Page_Loaded(ByVal o As Object, ByVal e As EventArgs)
' Required to initialize variables
InitializeComponent()
End Sub
Private Sub ellipse_MouseLeftButtonDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles ellipse.MouseLeftButtonDown
Timeline1.Begin()
End Sub
End Class
Mouse ile nesneleri nasıl boyutlandırırz?
Yukarıdaki soruya kıyasla bu biraz ağır bir konu sayılabilir. İlk olarak
sorunun çözümüne dair mantığı kavramamız gerekiyor. Hedefimiz Silverlight 1.1
içerisinde bir nesnenin büyüklüğünü, yani genişlik ve yüksekliğini farenin
ekrandaki konumuna göre ayarlayabiliyor olmak. Kullanıcı fareyi ekranda
gezdirdikçe farenin konumuna göre objemizi tekrar boyutlandıracağız.
Boyutlandırma işlemini yapabilmek için fare ile nesneye tıklandığı anda nesnenin
yükseklik ve genişliğini bir kenara not alıp fare sürüklendikçe eski konumu ile
yeni konumu arasındaki farkı nesnenin boyutuna yansıtacağız. Gelin ilk olarak
kullanacağımız global değişkenlerimizi tanımlayalım.
Boolean Tikli = false;
Point BaslangicKonum;
Double BaslangicYukseklik;
Double BaslangicGenislik;
Gördüğünüz gibi toplam dört adet değişkenimiz var. Bunlardan ilki
Tikli adında bir Boolean değişken. Fare ekranda
gezdirildikçe nesnemizi boyutlandıracağımızdan bahsetmiştik. Tabi boyutlandırma
işleminin başlaması için kullanıcının nesneye tıklayıp sürüklemesi gerekecek. O
nedenle nesneye tıklandığında global değişkenimiz Tikli'yi
True yaparak fare sürüklendikçe boyutlandırılma yapılmasını
onaylayacağız. Farenin sol düğmesi bırakıldığında Tikli
değişkenini False yaparak boyutlandırmayı durduracağız. Bunun
haricinde BaslangicKonum değişkenimiz farenin sürüklemenin
başındaki konumuzun hafızada saklayacak, böylece sürüklenen miktarı bularak
nesneye yansıtacağız. Nesnenin başlangıçtaki genişlik ve yüksekliğini de birer
değişkende saklıyor olacağız. Bu değerler üzerine farenin ekrandaki konum
değişikliğini ekleyeceğiz.
InitializeComponent();
ellipse.MouseLeftButtonDown += new MouseEventHandler(ellipse_MouseLeftButtonDown);
ellipse.MouseLeftButtonUp += new MouseEventHandler(ellipse_MouseLeftButtonUp);
this.MouseLeftButtonUp += new MouseEventHandler(ellipse_MouseLeftButtonUp);
this.MouseMove += new MouseEventHandler(Page_MouseMove);
C# için yukarıdaki gibi Event Handler tanımlamalarımızı yapmamız gerekiyor.
İlk örneğimizdeki aynı XAML kodu kullanarak ellipse nesnemizi
boyutlandıracağız. O nedenle ellipse'in
MouseLeftButtonDown ve MouseLeftButtonUp durumlarını
kontrol etmemiz gerekiyor. Ayrıca Silverlight uygulamamızın genelinde de
MouseLeftButtonUP ve MouseMove durumlarını kontrol
edeceğiz. Bu durumlarda neler yapacağımıza birazdan bakacağız.
void ellipse_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
Tikli=true;
BaslangicKonum=e.GetPosition(this);
BaslangicGenislik=ellipse.Width;
BaslangicYukseklik = ellipse.Height;
}
ellipse üzerine fare ile tıklandığında ve farenin düğmesi
tıklı duruma geldiğinde yukarıdaki kodumuz çalışacak. Tıklandığı anda hemen
Tikli değişkenimizi True olarak düzenliyoruz.
Sonrasında e.GetPosition(this) diyerek farenin Silverlight
animasyonumuzun neresinde olduğunu global değişkenimize aktarıyoruz. Aynı
şekilde ellipse'in genişlik ve yüksekliğini de değişkenlerimize
alıyoruz.
void ellipse_MouseLeftButtonUp(object sender, MouseEventArgs e)
{
Tikli = false;
}
Yukarıda tanımladığımız kodumuzu hem ellipse'in hem de genel
olarak Silverlight uygulamamızın MouseLeftButtonUp durumuna
bağladık. Her iki şekilde de farenin tuşunu kullanıcı bıraktığında Tikli
değişkenimizi False yaparak artık boyutlandırma işleminin
yapılmamasını sağlayacağız. Gelelim boyutlandırma işlemine.
void Page_MouseMove(object sender, MouseEventArgs e)
{
if (Tikli)
{
Point SimdikiKonum = e.GetPosition(this);
ellipse.Width = Math.Abs(SimdikiKonum.X-BaslangicKonum.X+BaslangicGenislik);
ellipse.Height = Math.Abs(SimdikiKonum.Y - BaslangicKonum.Y + BaslangicYukseklik );
}
}
Genel olarak tüm Silverlight uygulamamız üzerinde fare sürüklendiği sürece
yukarıdaki kod çalışacak. İlk olarak Tikli değişkenini kontrol
ediyoruz. Eğer fare ile ellipse nesnemize tıklanmışsa ona uygun
boyutlandırma işlemini yapmamız gerekiyor. SimdikiKonum adında
bir değişken tanımlayarak farenin mevcut konumunu alarak hem X hem de Y
yönlerinde farenin başlangıçtaki konumu ile farklarını, üzerine de nesnemizin
başlangıçtaki genişlik ve yüksekliğini koyarak tekrar genişlik ve yükseklik
değerlerine aktarıyoruz. Böylece farenin sürüklenme miktarı nesnenin genişliğine
ve yüksekliğine eklenmiş oluyor. Tüm bunları yaparken Math.Abs
metodu ile hesaplanan değerin mutlak değerini alarak nesnemizin her zaman
görünür boyutlarda olmasını sağlıyoruz.
Kodumuzun tamamı aşağıdaki şekilde sonlanıyor.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverlightProject16
{
public partial class Page : Canvas
{
Boolean Tikli = false;
Point BaslangicKonum;
Double BaslangicYukseklik;
Double BaslangicGenislik;
public void Page_Loaded(object o, EventArgs e)
{
// Required to initialize variables
InitializeComponent();
ellipse.MouseLeftButtonDown += new MouseEventHandler(ellipse_MouseLeftButtonDown);
ellipse.MouseLeftButtonUp += new MouseEventHandler(ellipse_MouseLeftButtonUp);
this.MouseLeftButtonUp += new MouseEventHandler(ellipse_MouseLeftButtonUp);
this.MouseMove += new MouseEventHandler(Page_MouseMove);
}
void Page_MouseMove(object sender, MouseEventArgs e)
{
if (Tikli)
{
Point SimdikiKonum = e.GetPosition(this);
ellipse.Width = Math.Abs(SimdikiKonum.X-BaslangicKonum.X+BaslangicGenislik);
ellipse.Height = Math.Abs(SimdikiKonum.Y - BaslangicKonum.Y + BaslangicYukseklik );
}
}
void ellipse_MouseLeftButtonUp(object sender, MouseEventArgs e)
{
Tikli = false;
}
void ellipse_MouseLeftButtonDown(object sender, MouseEventArgs e)
{
Tikli=true;
BaslangicKonum=e.GetPosition(this);
BaslangicGenislik=ellipse.Width;
BaslangicYukseklik = ellipse.Height;
}
}
}
Bir de VB.NET tarafına bakalım :)
Partial Public Class Page
Inherits Canvas
Dim Tikli As Boolean = False
Dim BaslangicKonum As Point
Dim BaslangicGenislik As Double
Dim BaslangicYukseklik As Double
Public Sub Page_Loaded(ByVal o As Object, ByVal e As EventArgs)
' Required to initialize variables
InitializeComponent()
End Sub
Private Sub ellipse_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ellipse.MouseLeftButtonDown
Tikli = True
BaslangicKonum = e.GetPosition(Me)
BaslangicGenislik = ellipse.Width
BaslangicYukseklik = ellipse.Height
End Sub
Private Sub ellipse_MouseLeftButtonUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles ellipse.MouseLeftButtonUp
Tikli = False
End Sub
Private Sub Page_MouseLeftButtonUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseLeftButtonUp
Tikli = False
End Sub
Private Sub Page_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles Me.MouseMove
If Tikli Then
Dim SimdikiKonum As Point = e.GetPosition(Me)
ellipse.Height = Math.Abs(SimdikiKonum.Y - BaslangicKonum.Y + BaslangicYukseklik)
ellipse.Width = Math.Abs(SimdikiKonum.X - BaslangicKonum.X + BaslangicGenislik)
End If
End Sub
End Class
Böylece sorunumuzu çözmüş aldık. Artık ellipse nesnesine tıklanarak nesne
Silverlight animasyonu içerisinde boyutlandırılabilecek.
Silverlight 1.1 ile ilgili gelen sorular şimdilik bu kadar.
Hepinize kolay gelsin.
Sektörle ilgili haberleri tek tek bloga eklemektense biraz biriktirip toplu
eklemeyi daha uygun buluyorum. Özellikle bu serideki bir haberin artık
yayınlanabileceği son gün geldiği için hemen elimdeki beş haberi bloguma koymak
istedim. İyi okumalar :)
Silverlight Showcase'de Türk Bayrağı Dalgalanır!
http://silverlight.net/showcase/
adresinden dünya çapındaki seçkin Silverlight uygulamalarının bir listesine
ulaşabilirsiniz. Uygulamaların listelendiği sayfa da ayrıca bir Silverlight
şaheseri :) Konumuza dönersek, söz konusu sayfanın sol tarafında uygulamalarının
yapıldıkları ülkelere göre filtrelendiği bir bölüm yer alıyor. Bu bölümde artık
Türk Bayrağı da var. ODTÜ BÖTE'den Prof. Dr. M.Yaşar
Özden'in desteği ile hazırlanan ve internet ortamından görsel olarak
seminerlerin, eğitimlerin yayınlandığı Silverlight video oynatıcı ortamı
Silverlight resmi sitesinde ülkemizin bayrağı altında listeleniyor. Umarım kısa
zamanda yeni uygulamalar ile listeyi genişletiriz.
 Silverlight Showcase sitesinde Türk Bayrağı.
Microsoft HD-Photo standartlaşıyor : JPEG XR
Şu an kullandığımız JPEG standartını oluşturan uluslararası Joint Photographic Experts Group
bir sonraki adım olarak Microsoft'a ait HD-Photo yapısını JPEG XR olarak
standartlaştırmaya karar verdi. Konuyla ilgili önemli bir otorite olarak Adobe
JPEG XR formatını destekleyeceğini belirtti. HD-Photo desteği hali
hazırdaWindows Vista ile beraber zaten geliyor. Eski adıyla Windows
Media Photo sonrasında HD-Photo olarak
adlandırıldığında Microsoft formatın tamamen ücretsiz olarak dağıtılabileceğini
ve kullanılabileceğini açıklamıştı. HD-Photo ile ilgili DPK (Device Porting Kit)
yüklemesini aşağıdaki adresten indirebilirsiniz.
http://www.microsoft.com/downloads/details.aspx?FamilyID=285eeffd-d86c-48c3-ab93-3abd5ee7f1ce&displaylang=en
HD-Photo ile ilgili gelişmeler ve detaylar için Microsoft'da HD-Photo Program
Müdürü Bill Crow'un
blog sitesini ziyaret edebilirsiniz.
Blog Konferansı Yarın!
Microsoft sponsorluğunda düzenlenen Blog Konferansı '07 organizasyonu Yıldız
Teknik Üniversitesi'nde gerçekleştirilecek. Programın detayları için
http://www.blogkonferansi.com/
adresini ziyaret edebilirsiniz. Blog sitesinde sahip olanlar, olmayanlar veya
blog dünyasına girmeyi düşünenler için tavsiye ederim.
Microsoft Dynamics Zirvesi 2007
Dynamics ürün ailesi ile ilgilenenlerin kesinlikle kaçırmaması gereken bir
gün. Dört paralel seansta toplam yirmi sunumdan oluşacak aktivitenin sloganı "Ürün tanıtımları değil, yaşadığınız problemleri çözmüş müşterilerimizin gerçek deneyimlerini paylaşacağız."
şeklinde. 8 Kasım 2007, Perşembe günü saat 09.00-17.00 arasında Swiss Hotel'de
yapılacak zirveyle ilgili detaylı bilgilere
buradan ulaşabilirsiniz.
Gençsen "Gelecek"sin!!
Süper bir slogan ama bir an kendime "Genç miyim?" diye sormama ve
hüzünle "Yaşlandım" dememe neden oldu. :) Her neyse konumuza dönelim;
Microsoft Türkiye MSP (Microsoft Studen Partner) grubunun öncülüğünde düzenlenen
üniversiteler turunda Silverlight'dan tutun Surface Computing'e kadar çok geniş
bir içerik her gün başka bir üniversiteyi ziyaret ediyor olacak. Özellikle
üniversite öğrencilerine şiddetle tavsiye ettiğim bu günleri sevgili kardeşim
Ali
Rıza Babaoğlan'ın sitesinden takip edebilirsiniz.
Yepyeni bir webiner ile tekrar karşınızdayım :) 7 Kasım Çarşamba
günü saat 15:15-16.00 arası Silverlight uygulamaları ile
ASP.NET 2.0 ve ASP.NET AJAX Extension kullanımına değineceğiz. İstemci tarafında
Silverlight ile ASP.NET AJAX Extension entegrasyonu sağlayarak sunucu tarafında
herhangi bir veritabanından asenkron olarak veri çekerek yine Silverlight
tarafında verimizi kullanacağız.
Meeting ID: 3KJ7K7
Webiner Bağlantısı :
https://www112.livemeeting.com/cc/microsoft/join?id=3KJ7K7&role=attend&pw=x4G%40Ncxxd
Webinere kayıt olmak için tıklayınız.
Bu webiner Microsoft Kurumsal Webiner serisinden olduğu için yukarıdaki
linkten giriş yaparak kayıt olmanız gerekiyor.
Silverlight Streaming Servisleri ile ilgili daha önceki
yazılarımda detaylardan bahsetmiştim. Bugün ise size Silverlight Streaming
Servisleri ile video yayınını daha da kolaylaştıran bir Plug-In duyuracağım.
Silverlight Streaming Publishing Plug-In for Expression Encoder
Yukarıdaki adresten indirebileceğiniz Expression Encoder eklentisi ile artık
direk Expression Encoder kullanarak yarattığınız Silverlight Video
Oynatıcılarını Silverlight Streaming Servislerine yükleyebilirsiniz. Bunun için
eklentiyi yükledikten sonra ilk yapmanız gereken Silverlight Streaming Servis
hesabınızdan Account ID ve Account Key
bilgilerini alarak Expression Encoder içerisine yerleştirmek.
 Silverlight Streaming Serivis Bilgileri
Yukarıdaki görseldeki gibi
http://silverlight.live.com/ adresinden sisteme Live ID'miz ile giriş
yaptıktan sonra "Manage Account" kısmında gerekli bilgileri
alarak direk Expression Encoder'da Output kısmına yerleştirebiliyoruz.
 Expression Encoder içerisinde eklentiler.
Expression Encoder içerisinde Output tabında yeni bir bölüm
olarak "Publish" seçeneği karşımıza çıkıyor. Buradan
Publish To kısmında "Silverlight Streaming" seçerek
işlemimize devam edebiliriz. Bir sonraki adımda isterseniz yükleyeceğiniz video
uygulaması için bir Application Name (Uygulama İsmi)
tanımlayabilirsiniz. Son olarak Silverlight Stream Servisleri web sitesinden
aldığımız Account ID ve Key'i de buraya
yerleştirdiğimizde ayarlarımız tamamlanmış oluyor. Bölmenin alt kısmına doğru
size bir IFRAME kodu veriliyor. Söz konusu IFRAME
kodunu herhangi bir web sitesine kopyalayarak uygulamanın kendi sitenizde direk
Silverlight Streaming Servisleri üzerinden çalıştırılmasını sağlayabilirsiniz.
Eğer isterseniz en alt bölmeden daha önce Silverlight Streaming Servisleri'ne
yüklediğiniz diğer uygulamaları silme veya görme şansınız da var.
Videonuzu bir kez Expression Encoder içerisinde bir Output Template
(Şablon) seçerek Encode ettikten sonra Publish
düğmesi aktif hale gelecektir. Hemen söz konusu düğmeye basarak yüklemeyi
başlatabilirsiniz.
 Videomuz Silverlight Streaming Servisleri'ne yükleniyor...
Hepinize kolay gelsin.
PCnet'in Kasım sayısında yepyeni yazılarımla yine karşınızdayım :) Derginin
OKUL bölümünü genişlettik, artık AJAX, Silverlight,
Expression Web, Expression Blend ve Expression Design ile ilgili yazıyor olacağım. Dünyada ilk defa bir dergide Silverlight Eğitim içeriğine yer veriliyor. Kasım sayısındaki yazılarımın başlıkları aşağıdaki şekilde;
AJAX : UpdatePanel Mucizesi
Silverlight : Expression Encoder ve Silverlight
Expression Blend : Windows Uygulamarında Animasyonlar
Expression Web: Güle Güle Frontpage
Expression Design : Vektörel Tasarım ve XAML Tek Merkezde
Tüm bu yazılara ek olarak Kasım sayısına özel bir sürpriz makale daha var :)
Flash VS Silverlight
Tahmin ettiğiniz gibi Flash ve Silverlight arasında çetin bir karşılaştırma
yazısından bahsediyorum. Hepsi PCnet Kasım sayısında! :)
Dünkü Silverlight ve MediaElement örneğimize VideoBrush ile
devam edeceğiz. İlk olarak MediaElement nesnemizi biraz daha ufaltarak yansıma
için ekranda yer açalım. Sonrasında da MediaElement'imize bir isim vereceğiz.
<MediaElement x:Name="Goruntu" Source="Bear.wmv" MouseLeftButtonDown="VideoTiklandi" Width="384" Height="288" Stretch="Fill" Canvas.Left="8" Canvas.Top="8"/>
Yukarıdaki biri x:Name diyerek herhangi bir elemente isim verme şansımız var.
Bu işlemi Expression Blend 2 içerisinde görsel arayüzden de yapabiliriz.
 MediaElement'imize isim veriyoruz.
Verdiğimiz bu isim ileride bir VideoBrush tanımlarken çok
işimize yarayacak. Şimdi gelin videonun yansımasını gösterecek olan, ekranda
taşıyacak olan nesnemizi belirleyelim. Bunun için basit bir dikdörtgen (rectangle)
kullanacağız. Rectangle nesnesini Expression Blend 2 içerisinde
solda araç çubuğunda bulabilirsiniz. Dikdörtgenin bir yansımayı temsil
edebilmesi için perspektifi ile oynamanın yanı sıra dikdörtgene bir de
OpacityMask uygulayacağız.
 Dikdörtgenimize uyguladığımız perspektif ve yansıma efektleri.
Yukarıdaki ekran görüntülerinde de görebileceğiniz üzere ilk olarak
dikdörtgenin Y ekseninde yansımasını alıyoruz sonrasında da perspektif
veriyoruz. Son olarak da sıra geldi bir OpacityMask uygulamaya.
Böylece yansıma görünür durumdan başlayarak şeffaflığa doğru kaybolacak.
 OpacityMask ayarlarımızı yapıyoruz.
Dikdörtgeni Expression Blend 2 içerisinde seçtikten sonra sağ sütundan
Properties sayfasında OpacityMask'ı seçiyoruz.
OpacityMask olarak uygulamak üzere bir Gradient
seçerek gradient renklerinden birinin Alpha
değerini sıfır yaparak şeffaftan görünürlülüğe doğru giden bir efekt
yaratıyoruz. Efektin yönünü ayarlamak için Expression Blend 2'nin sol araç
çubuğundan Brush Transform aracını kullanabilirsiniz.
Tüm bunları tamamladığımızda dikdörtgenimizin XAML kodu aşağıdaki şekilde
sonlanıyor.
<Rectangle Width="380.569" Height="70" Canvas.Top="297" RenderTransformOrigin="0.5,0.5" Canvas.Left="-25" Opacity="0.8">
<Rectangle.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="-1"/>
<SkewTransform AngleX="23.963" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="51.527" Y="0"/>
</TransformGroup>
</Rectangle.RenderTransform>
<Rectangle.OpacityMask>
<LinearGradientBrush EndPoint="0.514,0.957" StartPoint="0.507,0.129">
<GradientStop Color="#00000000" Offset="0"/>
<GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Rectangle.OpacityMask>
</Rectangle>
Tüm ayarlarımızı tamamladığımıza göre sıra geldi bir VisualBrush
tanımlayarak dikdörtgenini içini bu VisualBrush ile doldurmaya.
Bu işlemleri direk XAML kodları yazarak yapacağız. Aşağıda bir VisualBrush'ın
nasıl tanımlandığını inceleyelim.
<VideoBrush SourceName="Goruntu" />
Hiç zor bir kod sayılmaz. Tek yapmamız gereken hedef video kontrolünün adını
SourceName özelliğine aktarmış olmak. Tanımladığımız bu
VideoBrush'ı dikdörtgenin Fill değerine atayacağız. XAML
sayfamızın tamamının son hali aşağıdaki şekilde sonlanıyor.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="435" Height="382"
Background="White"
x:Name="Page"
>
<MediaElement x:Name="Goruntu" Source="Bear.wmv" MouseLeftButtonDown="VideoTiklandi" Width="384" Height="288" Stretch="Fill" Canvas.Left="8" Canvas.Top="8"/>
<Rectangle Width="380.569" Height="70" Canvas.Top="297" RenderTransformOrigin="0.5,0.5" Canvas.Left="-25" Opacity="0.8">
<Rectangle.Fill>
<VideoBrush
SourceName="Goruntu" />
</Rectangle.Fill>
<Rectangle.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="-1"/>
<SkewTransform AngleX="23.963" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="51.527" Y="0"/>
</TransformGroup>
</Rectangle.RenderTransform>
<Rectangle.OpacityMask>
<LinearGradientBrush EndPoint="0.514,0.957" StartPoint="0.507,0.129">
<GradientStop Color="#00000000" Offset="0"/>
<GradientStop Color="#FFFFFFFF" Offset="1"/>
</LinearGradientBrush>
</Rectangle.OpacityMask>
</Rectangle>
</Canvas>
 VisualBrush ile yarattığımız video yansıması.
Bu yazımızda da VideoBrush tanımlamayı, nesnelere isim vermeyi, dikdörtgen
nesnelerini ve transform işlemlerinin bir kısmını inceledik. Silverlight ile
videoların yansımalarını almak bu kadar kolay. Bu yansımaların herhangi bir
performans alanında dezavantajı yok.
Biz örneğimizde tanımlamış olduğumuz VisualBrush'ı bir Rectangle'a ait
Fill
özelliğine aktardık. İsterseniz VisualBrush'ları aşağıdaki şekilde istediğiniz
yere aktarabilirsiniz. <TextBlock Width="244" Height="84" Canvas.Top="300" FontSize="72" FontWeight="Bold" Text="TextBlock" TextWrapping="Wrap">
<TextBlock.Foreground>
<VideoBrush SourceName="Goruntu" />
</TextBlock.Foreground>
</TextBlock>
Bu örnekte sayfaya yerleştirdiğimiz bir TextBlock nesnesinin
ForeGround özelliğine VisualBrush tanımladık.
Böylece TextBlock içerisinde yazan yazıların içinde videomuz oynatılacak.
 Yazının içerisinde video yerleştiriyoruz.
Tüm bu video işlemleri çok kolaylıkla sadece birkaç satır kod ile en ufak bir
performans kaybı olmaksızın yapılabilir. Gerisi tamamen sizin hayal gücünüze
kalmış.
Hepinize kolay gelsin.
Geçen hafta Microsoft İstanbul ofislerinde düzenlediğimiz Silverlight ve Expression Studio Eğitimi'nden daha önceki yazılarımda bahsetmiştim. Eğitimin katılımcılarından sevgili Eren Emre Kanal blogumdaki bir yazıya gönderdiği yorumda muhteşem bir link paylaştı :) Eğitim sonrası bilgisayarı başına oturarak eğitimin süper bir özetini çıkarmış. Açıkçası uzun zamandır benim yazmam gereken fakan zamansızlıktan yazamadığım güzel bir yazıyı kendi sitesi üzerinden bizlerle paylaşıyor. Aşağıdaki adrese tıklayarak yazıya ulaşabilirsiniz.
http://www.siberkultur.com/?q=microsoft-silverlight
Sevgili Eren'in yazısını okuduktan sonra hemen bir yorum gönderdim :) Yazıda Eren'in bahsetmiş olduğu Silverlight ile ilgili bir endişesi var. Silverlight uygulamalarının tamamen "metin" / "plain text" olarak istemci tarafına gidiyor olması uygulamanın tüm kaynak kodlarının rahatlıkla istemcideki kullanıcı tarafından alınabilmesini sağlıyor. Bu durum bir açıdan güzel :) Webde gördüğümüz ve "Acaba nasıl yapmışlar?" dediğimiz uygulamalarının kodlarını inceleme şansımız oluyor. Diğer yandan ticari kaygı yüzünden kodlarını paylaşmak istemeyecek kurumlar da olacaktır. Kaynak kod koruması anlamında Silverlight 1.1 ile durum biraz daha güzelleşiyor diyebilirim. Silverlight 1.1 ile .NET programlama dillerini kullanacağımız için yazdığımız kodlar bir DLL haline getirilerek istemciye gönderiliyor. Tabi ki bugün SWF dosyalarında olduğu gibi .NET DLL'lerinin de Decompile (Kaynak kodunun kısmen elde edilmesi) mümkün. Eminim ki bu alanda kısa sürede üçüncü parti yazılımlar ticari olarak sektörde yerini alacaktır.
Sevgili Eren'e tekrar teşekkür ederek (sitesini de blog sitemdeki "Okuduğum Bloglar" listesine ekleyerek) yazımı sonlandırıyorum.
Silverlight 1.0 uygulamalarında Video yayınının gücünden daha önceki yazılarımda bahsetmiştim.
Gelin şimdi hep beraber sıfırdan bir Silverlight Video Oynatıcı'sı hazırlayalım.
Expression Blend 2 September Preview yazılımını kullanacağımız
bu demoda yeni bir Silverlight (JavaScript) projesi yaratarak Page1.xaml
üzerinde çalışacağız. Dosyamıza bir adet MediaElement
eklememiz gerekiyor, bunun için Expression Blend 2 içerisinde sol araç
çubuğundan Asset Library'ye girerek "MediaElement" yazarak
kontroller arasında arama yaptırmamız gerekiyor. Kontrol listesi içerisinde
MediaElement'i bulduktan sonra sayfaya ekleyebilirsiniz.
 Asset Library içerisinden MediaElement'imizi buluyoruz.
MediaElement'i sayfaya ekledikten sonra sıra geldi bir de video dosyası
eklemeye. MediaElement'e ait Source özelliğine Blend 2 içerisinden bir video
bağladığımızda video dosyasının bir kopyası projemize otomatik olarak ekleniyor.
 MediaElement'e ait Source özelliğine videomuzu gösteriyoruz.
Bu işlemleri tamamladıktan sonra Silverlight uygulamamızı direk
çalıştırabiliriz. Video dosyamız MediaElement içerisinde
oynatılıyor olacaktır. Şimdi gelin videonun üzerine tıklandığında durmasını
sonra da tekrar tıklandığında devam etmesini sağlayalım. Bunun için
MediaElement'e ait MouseLeftButtonDown özelliğine bir
JavaScript fonksiyonu atamamız gerekiyor. Maalesef bunu şimdilik direk XAML kodu
içerisinde yapmamız gerekiyor, Expression Blend 2 içerisinde bu işlem için bir
arayüz yok. Benim tavsiyem Video projesini Blend 2 ile beraber aynı anda Visual
Studio ile de açmanız. Visual Studio içerisinde XAML Intellisense desteğini de
kullanarak daha rahat bir çalışma ortamı yaratabilirsiniz. VideoTiklandi
adinda bir JavaScript fonksiyonunu aktardığımız MediaElement
nesnemizi içeren XAML kodumuzun tamamı aşağıdaki şekilde sonlanıyor.
<Canvas
xmlns="http://schemas.microsoft.com/client/2007"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="400"
Background="White"
x:Name="Page"
>
<MediaElement Canvas.Left="8" Canvas.Top="8" Source="Bear.wmv"
MouseLeftButtonDown="VideoTiklandi"/>
</Canvas>
Sıra geldi JavaScript fonksiyonumuzun kendisini yazmaya. Page.xaml.js
adında Expression Blend 2 tarafından yaratılmış JavaScript dosyasında bize örnek
olması amacıyla bazı kodlar yerleştirilmiş. İlk olarak bu kodları silerek Page.xaml.js'i
aşağıdaki hale getirmemiz gerekiyor.
if (!window.VideoYansima)
window.VideoYansima = {};
VideoYansima.Page = function()
{
}
VideoYansima.Page.prototype =
{
handleLoad: function(control, userContext, rootElement)
{
}
}
Tüm bu kodların devamına VideoTiklandi JavaScript
fonksiyonumuzu tanımlayalım. Fonksiyonumuz video eğer oynatılıyorsa durduracak,
durdurulmuş durumdaysa tekrar devam ettirecek. Videonun var olan durumunu
saklamak üzere Oynuyor adında bir JavaScript değişkeni
kullanacağız.
var Oynuyor = true;
function VideoTiklandi (sender, args)
{
if (Oynuyor)
{
sender.pause();
Oynuyor = false;
}
else
{
sender.play();
Oynuyor = true;
};
}
Yukarıdaki kod içerisindeki standart JavaScript işlemlerinin yanı sıra Silverlight ile ilişkili olarak dikkat etmemiz gereken noktalardan biri MediaElement'imize
sender JavaScript objesi üzerinden ulaşabiliyor olmamız. Hali
hazırda JavaScript fonksiyonumuzu MediaElement üzerinden tetiklediğimiz için
sender nesnesi de MediaElement'in ta kendisi oluyor.
MediaElement'in doğrudan play(), pause() ve stop()
metodlarını kullanarak videoyu durdurabilir, başlatabilir veya
bulunduğu yerden devam ettirebiliriz.
Basit bir Silverlight video oynatıcısı hazırladığımız bu örnekte
MediaElement'i ve JavaScript fonksiyonlarının Silverlight yapısındaki yerini
hızlıca inceledik. Bu yazımı takiben sonraki makalemde bu örneğimize devam
ederek MediaElement içerisindeki videonun VideoBrush
ile yansımasını almayı öğreneceğiz.
Hepinize kolay gelsin.
Türkiye'nin ilk Silverlight ve Expression Studio
eğitimini Microsoft İstanbul ofislerinde bugün sonlandırdık. Üç günlük yoğun bir
maraton sonrasında yaptığım anketlerde gelen olumlu yorumlardan yola çıkarak
süper bir eğitim geçirdiğimizi söyleyebilirim. Bu ilk kurumsal eğitimde
özellikle yazılımda zengin medya sektörünün guruları ile eğlenceli bir ortamda
beraber olmak çok zevkliydi. Bilgeadam,
Netron,
LuckyEye,
Enocta,
MagiClick,
Yogurt,
Digital Graphics,
Pure ve
Project House'un katıldığı eğitim boyunca
Expression Studio serisini, Silverlight 1.0, 1.1 ve WPF'i inceleme şansımız
oldu. 
Eğitime katılan herkese tekrar teşekkürler.
Silverlight uygulamaları geliştirirken Expression Studio içerisinde yer alan, faydalanabileceğimiz birçok yazılım bulunuyor. Expression Studio yazılımları ile Silverlight uygulamalarının ilişkilerini incelediğimiz ve hangi uygulamayı hangi aşamada ne amaçlı kullanabileceğimizi görebileceğimiz bu görsel derste ek olarak beni de görme şansınız olacak :) İlk olarak Türkçe görsel derslerimden birinde WebCam kullandım :) Dikkat dağıtıcı mı olur yoksa faydalı mı bilemiyorum, ama bana güzel oldu gibi geliyor :)
nedirtv?com üzerinden paylaştığım görsel derse aşağıdaki adresten ulaşabilirsiniz.
Expression Studio ve Silverlight
Silverlight uygulamaları geliştirmeyle ilgili makalelerime geçmeden önce
yavaş yavaş bilgisayarlarımızı Silverlight uygulamalarına hazırlamaya
başlayalım. İlk olarak aşağıdaki adreslerden Silverlight 1.0'ı bilgisayarımıza
kurmamız gerekiyor. Bu kurulum bilgisayarımızda Silverlight 1.0 uygulamalarının
çalıştırılabilmesini sağlayacak.
http://www.microsoft.com/silverlight/downloads.aspx
Kurulumu tamamladıktan sonra sıra geldi yazılım geliştirme araçlarımızı da
Silverlight uyumlu hale getirmeye. Bu noktada eğer Visual Studio 2008 Beta 2
kullanacaksanız
Microsoft Silverlight Tools Alpha Refresh for Visual Studio 2008 Beta 2 (July 2007)
paketini kurmanız gerekiyor. Eğer sisteminizi Beta yazılımlar ile riske atmak
istemiyorsanız ve Visual Studio 2005 ile devam edecekseniz benim tavsiyem ilk
olarak
Visual Studio 2005 extensions for .NET Framework 3.0 (WCF
& WPF), November 2006 CTP paketini bilgisayarınıza kurmanız. Böylece artık
WPF uygulamalarını da Visual Studio ile açabilirsiniz. Silverlight tarafına
gelince de
Microsoft Silverlight 1.0 Software Development Kit
paketini bilgisayarınıza kurmanız gerekiyor. Kurulumu tamamladıktan sonra
"Başlat" / "Start" menünüze "Microsoft Silverlight 1.0 SDK"
bölümü gelecektir. Bu bölümde Silverlight 1.0 Visual Studio 2005
Template adında bir kurulum daha bulacaksınız. Bu kurulumu da
yüklediğinizde artık Visual Studio 2005 içerisinde yeni bir proje yaratırkan "Visual
C#" altında "Silverlight" seçeneği ile de karşılaşacaksınız. Bu seçeneğin sadece
Visual C# altında çıkıyor olmasının nedeni Silverlight proje şablonu'nun C#
proje şablonlarından türetilmiş olması. Aksi halde Silverlight 1.0'ın C#, VB
gibi .NET dilleri ile herhangi bir ilişkisi yok.
 Visual Studio 2005 içerisinde Silverlight Proje seçeneği.
Artık Visual Studio 2005 ile Silverlight projeleri yaratabilir veya var olan
projeleri açabiliriz. Tabi bu noktada "Varolan proje nerden var olacak biz
yaratmazsak?" diyenler varsa :) Silverlight projeleri yaratabileceğimiz bir
diğer alternatif yazılıma geçiş yapmakta fayda var. Aslına bakarsan tam olarak
bir alternatif denemez çünkü Expression Blend 2 ile Visual Studio'nun
projelerdeki konumu çok farklı. Expression Blend 2 görsel animasyonların
hazırlanması noktasında devreye girerken Visual Studio ise zengin Intellisense
desteği ile daha çok programcılara hitap ediyor. Şu an için Visual Studio 2005
içerisinde JavaScript Intellisense desteği bulunmasa da 2008 sürümünde bu konuda
da ciddi gelişmeler olacak.
Konuya geri dönmemiz gerekirse, bilgisayarınıza Expression Blend 2'yi de
aşağıdaki adresten yükleyebilirsiniz. Blend 2 şu an September Preview
aşamasında, yani daha tam anlamıyla yayınlanmış, son haline gelmiş bir yazılım
değil.
http://www.microsoft.com/Expression/products/download.aspx?key=blend2preview
Tüm bu yüklemeleri yaptığınızda aslında tüm hazırlıklarınızı da bitirmiş
oluyorsunuz fakat eksik kalan ufak bir nokta var. Visual Studio içerisinde
Silverlight uygulamalarımızın XAML kodlarını düzenleme şansımız var. Eğer
yukarıda bahsettiğim gibi WPF desteğini de yüklediyseniz zaten Visual Studio
XAML dosyaları açarak size gerekli Intellisense desteğini sağlayacaktır. Fakat
konu Silverlight olunca Intellisense desteğinin de farklılaşması gerekiyor çünkü
Silverlight içerisindeki XAML yapısı WPF'deki kadar zengin değil ve aslında
Silverlight içerisinde kullanamayacağımız kodların Intellisense ile gelmesi
durumu söz konusu ki bu hiç de hoş bir durum değil. O nedenle Silverlight için
özel bir Intellisense veritabanı yüklememiz gerekiyor. Bu veritabanı Silverlight
1.0 SDK ile beraber geliyor.
Benim bilgisayarıma yaptığım kurulumda ihtiyacım olan Silverlight.xsd
dosyasını C:\Program Files\Microsoft Silverlight 1.0 SDK\Tools\silverlight.xsd
adresinde buldum. Bu dosyayı alarak yine kendi bilgisayarımdaki
C:\Program Files\Microsoft Visual Studio 8\Xml\Schemas adresine
kopyaladım. Siz bilgisayarınızdaki kurulumlara göre bu yolları
özelleştirebilirsiniz.
Tüm işlemleri tamamladık. Artık sonraki makalelerde Silverlight
uygulamalarına yelken açabiliriz.
Hepinize kolay gelsin.
Expression Studio içerisinde yer alan
Expression Encoder ile farklı formatlardaki videoları alarak WMV dosyaları çevirmek ve otomatik olarak
Silverlight ile yayınlamanın ne kadar kolay olduğunu merak ediyorsanız :) aşağıdaki video tam size göre.
nedirtv?com üzerinden paylaştığım görsel derse aşağıdaki adresten ulaşabilirsiniz.
Expression Encoder ile Silverlight
"Ne zaman Silverlight uygulamaları hazırlamaya başladık da sıra
performansa geldi?" diyenleriniz olabilir :) Haklısınız, umarım yakında
giriş seviyesi Silverlight yazıları da yazabilirim. Aslında bu
tür yazılar yazıyorum ama maalesef şimdilik her ay yayınlanmak üzere PC.NET'e
gidiyor yazılar. (Reklam yaptığımın farkındayım:)) Gelin şimdi konuya dönelim ve
Silverlight uygulamaları hazırlarken performans konusunda yapabileceklerimizi
inceleyelim.
Şeffaf Fon Uygulamaları
Silverlight animasyonunuza şeffaf bir fon vermek çoğu zaman güzel görüntüler
alabilmek için uygun bir çözüm olacaktır. Böylece web sayfasının fonunun üzerine
oturtulmuş bir animasyon sayfadaki diğer nesnelerin üstünde olsa da aradaki fark
ziyaretçi tarafından algılanmaz. Tüm bunlara karşın gerekmeyen durumlarda
sürekli şeffaf fon kullanmak da ciddi performans kaybına neden olacaktır. O
nedenle herhangi bir Silverlight animasyonunuzun fonunu şeffafa değiştirirken
tekrar düşünmekte fayda var.
Animasyonlarınız için StoryBoard kullanın.
Hem Silverlight hem de WPF Windows Uygulamalarında animasyonlar StoryBoard'lar
aracılığı ile yapılır. Storyboard'lar ile hedef bir nesnenin Double, Point veya
Color tipindeki değerlerinin başlangıç ve son değerleri ayarlanarak aradaki
animasyonun otomatik yaratılması sağlanır. StoryBoard'lar yerine JavaScript ile
döngülerle nesnelerin özellikleri üzerinde oynayarak animasyonlar yaratmak ciddi
performans kaybı yaratacaktır. Aman dikkat diyorum.
Metinlerin Animasyonları
Metinleri animasyonlarda kullanırken metin boyutlarını değiştiriyorsanız
ciddi şekilde sistem kaynaklarını tüketiyorsunuz demektir. Metin olarak
düzenlenmiş bir nesneyi herhangi bir animasyon ile büyüttüğünüzde Silverlight
söz konusu metnin güncel büyüklükteki punto değerlerine göre tekrar
oluşturulmasını sonra da netleştirmesini yapacaktır. Yani 10 pikselden 20
piksele büyüyen bir yazı 10 kere tekrar oluşturulacaktır. Oysa bu tarz metinleri
vektörel çizimler olarak Silverlight animasyonlarınıza eklerseniz böyle bir
performans kaybı yaşamazsınız.
Sihirli Görünmezlik
Bir nesneyi görünmez yapmak için Opacity (Şeffaflık)
değerini 0 yapabilirsiniz, ama yapmayın :) Flash'dan alışık olunan bu yapının
yerine Silverlight'da direk nesnelere ait Visibility özelliği
var. Bir nesnenin şeffaflığı 0 olsa bile ekranda Silverlight tarafından
oluşturulmaya devam edecektir. Oysa nesne görünmez ise aslında artık onunla
ilgili görsel bir işlem yapılmaması gerekir. Bu durumda söz konusu nesnenin
Visibility özelliğini Collapsed olarak
ayarlarsanız nesne tamamen ekrandan kalkacak ve hiç sistem kaynaklarını meşgul
etmeyecektir.
Videolarınızı Yeniden Encode Edin
Eğer elinizdeki bir videoyu internette yayınlamak istiyorsanız WMV dosyanızı
ufak bir MediaElement içerisine yerleştirerek küçültmeyin. Eğer
videonun ufak boyutlarda gösterilmesi gerekiyorsa videonuzu söz konusu
boyutlarda tekrar encode edin ve uygulamanızda orijinal boyutlarıyla gösterin.
Gerçek zamanlı boyutlandırma video dosyaları için gereğinden fazla sistem
kaynağı tüketecektir. Diğer yandan ufak boyutlarda bir video dosya boyutu olarak
da ufalacağı için sunucu ve istemci arası veri trafiğinde de kara geçmiş
olursunuz.
Yoğun JavaScript İşlemlerine Dikkat
Eğer bir JavaScript fonksiyonunuz ile uzun sürecek bazı işlemler serisi
yaptıracaksınız bu seriyi ufak parçalara bölerek sırayla yaptırın. JavaScript
arka planda çalışırken Silverlight animasyonlarının devam
etmesi zor olacaktır ve performans düşüşü yaşanacaktır. Eğer işlemleri bölerek
sırayla yaptırırsanız Silverlight'a animasyonlarıyla devam etme şansı tanımış
olursunuz.
Hepinize kolay gelsin.
Daha önceki yazılarımda Silverlight Streaming Servisleri'nden bahsetmiştim.
http://silverlight.live.com/ adresinden ulaşabileceğimiz
bu ücretsiz servis ile 4GB'lık bir web alanında Silverlight uygulamalarımızı
dünyaya açabiliyoruz. Peki nasıl yapacağız bu işi? İlk olarak
http://silverlight.live.com sitesini
ziyaret ederek Live ID'miz ile kayıt olmamız gerekiyor. Kayıt işlemini
tamamladıktan sonra karşımıza gelen ekranda "Manage Applications" seçeneğini
seçerek Silverlight uygulamamızı bir ZIP dosyası olarak yükleyebiliyoruz.

Silverlight Streaming Services sitesine giriş yaptığımıza karşımıza çıkan
ekran.
Bir sonraki ekranda bizden ZIP dosyamız ve uygulamamıza verilmek üzere bir
isim isteniyor.

Yükledim ama çalışmıyor diyenler varsa büyük ihtimal ile benim yazılarımı ilk
defa okuyorlar demektir.Yazılarımı okurken bir yandan uygulama yapmamanızı
tavsiye ederim, çünkü genelde en can alıcı noktaya en sona bırakırım. Yukarıdaki
adımları takip ederek Silverlight uygulamanızı bir ZIP dosyası olarak sıkıştırıp
yüklediyseniz tabi ki uygulamanız çalışmayacaktır. Neden mi? Çünkü bu işin bazı
kuralları var. Gelin şimdi Silverlight Streaming Servisleri için nasıl ZIP
dosyası hazırlarız bir inceleyelim.
- Yükleyeceğiniz Silverlight uygulamasını bir ZIP paketine sıkıştırırken
kesinlikle HTML, HTM, ASPX, ASP, MEDIA, CSPROJ veya CONFIG uzantılı
dosyaları pakete eklememelisiniz.
- Dosyalarınız ZIP paketinin ana dizininde olmalıdır. Yani ZIP paketi
içerisinde bir klasörde vs bulunmamalılar.
- Tüm JavaScript dosyalarınız ve kaynaklarınız bir listesinin bulunduğu
Manifest.XML dosyası ZIP paketi içerisinde yer almalıdır.
Nedir bu Manifest.xml?
Manifest.xml dosyası Silverlight Streaming Servisleri'nin sizin Silverlight
uygulamanızla ilgili gerekli bilgileri edinebilmesini sağlayacak olan dosyadır.
Bu çerçevede tabi ki bizim söz konusu dosyayı doğru şekilde hazırlamış olmamız
çok önemli. Gelin aşağıda bir manifest.xml örneği inceleyelim.
<SilverlightApp>
<source>myfile.xaml</source>
<width>800</width>
<height>600</height>
<background>#00FFFFFF</background>
<version>1.0</version>
<isWindowless>true</isWindowless>
<loadFunction>StartWithParent</loadFunction>
<jsOrder>
<js>MicrosoftAjax.js</js>
<js>PreviewMedia.js</js>
<js>EmePlayer.js</js>
<js>player.js</js>
<js>StartPlayer.js</js>
</jsOrder>
</SilverlightApp>
Yukarıda örnek bir Mainfest.xml dosyasının içeriği görebilirsiniz. Silverlight
uygulamanızda eğer birden çok XAML dosyası varsa hangisinin ilk olarak
yükleneceğini belirtmeniz gerekiyor. Bunun için source
taglarını kullanıyoruz. Eğer sadece bir XAML dosyanız varsa bu tagı
yerleştirmenize gerek yok. JavaScript ile Silverlight uygulamanızı yaratırken
boyut, arkaplanı rengi bilgilerini belirtmediyseniz Manifest içerisinde de
belirtebilirsiniz. Version tagları arasında kullanmış olduğunuz Silverlight
sürümünü yazmanız gerekiyor. Biz şimdilik bu sürümü tek release sürümü olan 1.0
olarak bırakacağız. Eğer Silverlight uygulamanızın üzerine HTML Overlay tekniği
ile HTML nesneleri yerleştirecekseniz isWindowless seçeneğini
de true olarak düzenlemekte fayda var. Gelelim en can alıcı
ayarlara; bunlardan ilki Silverlight uygulamanızı yaratacak olan JavaScript
fonksiyonu. StartWithParent fonksiyonu yine Streaming
Servisleri tarafından yaratılıyor, isterseniz buraya farklı JavaScript
metodlarının isimlerini yazarak durumu siz de kontrol edebilirsiniz. Son olarak
uygulamanızda kullandığınız tüm JavaScript dosyalarını jsOrder
tagları arasına tek tek eklemeniz gerekiyor.
Deneyelim...
Hemen bir deneme yapalım ve ufak bir video dosyasını Expression Encoder ile
encode ederek Output kısmından da bir Silverlight Template seçerek Silverlight
oynatıcılı bir çıktı alalım. Eğer bilgisayarınızda Expression Encoder yüklü
değil ise ve hazırda bir WMV dosyanız varsa bir alternatif olarak
http://www.silverlightgenerator.com
'dan da faydalanabilirsiniz. Silverlight paketimizi hazırladıktan sonra
içerisinde gereksiz dosyaları (CSPROJ, HTML vs) siliyoruz ve aşağıdaki içeriği
ile manifest.xml dosyamızı yaratıyoruz.
<SilverlightApp>
<version>1.0</version>
<loadFunction>StartWithParent</loadFunction>
<jsOrder>
<js>MicrosoftAjax.js</js>
<js>BasePlayer.js</js>
<js>PlayerStrings.js</js>
<js>player.js</js>
<js>StartPlayer.js</js>
</jsOrder>
</SilverlightApp>
Gördüğünüz gibi çok fazla detaylı ayarlara bulaşmadan basit bir şekilde
JavaScript dosyalarını sıralayarak manifest.xml dosyamızı tamamladık. Şimdi tüm
bu paketi manifest.xml ile beraber bir ZIP dosyası haline
getirerek Silverlight Streaming Servisleri'ne yükleyebiliriz.
Yüklemem Tamam... Sıra Yayında...
ZIP paketinizi Silverlight Streaming Servisleri'ne yüklediğinizde karşınıza
aşağıdaki gibi bir sayfa gelecek ve Silverlight uygulamanızı web sitenize
eklemeniz için ihtiyaç duyacağınız kodları size aktarıyor olacak.
 Silverlight Streaming Servisleri'nden uygulamamızı kendi sitemize aktarıyoruz.
Yukarıdaki ekran görüntüsüne yer alan açıklamalardan da anlaşılacağı üzere en
üst kutuda yer alan kodu web sayfamızın HTML kodları arasında HEAD taglarının
arasına yerleştiriyoruz. İkinci kutuda yer alan kodları Silverlight
uygulamasının sitenizde gözükeceği konuma yerleştirmeniz gerekiyor. Son olarak
üçüncü kutudaki kodları ise harici olarak yaratacağımız bir
CreateSilverlight.js dosyasına yerleştirmeliyiz. Tüm bunlar
tamamlandığında basit bir HTML sayfasının kodu aşağıdaki şekilde sonlanıyor.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="http://agappdom.net/h/silverlight.js"></script>
<script type="text/javascript" src="CreateSilverlight.js"></script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled 2</title>
</head>
<body>
<div id="Wrapper_denek" style="width: 500px; height: 400px; overflow: hidden;">
</div>
<script type="text/javascript">
var Wrapper_denek = document.getElementById("Wrapper_denek");
CreateSilverlight();
</script>
</body>
</html>
Geçmiş Olsun..
Tüm yapmamız gereken bu kadar. Artık siz de Silverlight uygulamalarınızı
hemen yayına alabilirsiniz. Özellikle videolarınızı hemen Silverlight ile
hazırlayarak dünyaya açabilirsiniz.
Kolay gelsin...
Silverlight teknolojisinden en hızlı ve kolay şekilde faydalanabileceğimiz
noktalardan biri online video yayını. Özellikle WMV formatlı video dosyalarımızı
direk internet üzerinden yayınlayabilmemize olanak tanıyan Silverlight ile artık
elimizdeki videoları internete aktarmak gerçekten çok kolay.
Tabi video dosyasını direk internete koymak yetmiyor, uygun Silverlight
araçlarının da hazırlanmış olması gerekiyor. Bu noktada Expression Studio
içerisinden Expression Encoder ürününü kullanabiliriz. Ürün hem
farklı video formatlarından WMV'ye çeviri yapabilirken hem de otomatik şablonlar
ile Silverlight oynatıcıları hazırlayabiliyor. Benim burada size sunacağım çözüm
ise ağırlıklı olarak elinizde hazır olan WMV dosyalarınızı hemen internete
taşımanıza yardımcı olmak amacıyla geliştirilmiş. Geliştirilmiş diyorum ama
geliştiren de esasen benim :)
http://www.silverlightgenerator.com
Yukarıdaki adresten ziyaret edebileceğiniz sitenin dili ingilizce çünkü bu
sitenin yaptığı işi yapan bir site dünyada daha yok. Eh bizim için de iki kelime
ingilizce okumak bulunduğumuz sektör gereği çok zor olmayacaktır. Siteye
girdiğinizde üst kısma, internette yayınlamak istediğiniz WMV dosyasının adını
girmeniz gerekiyor. Sonrasında sol kısımdan beğendiğiniz bir Silverlight Video
Oynatıcı şablonunu seçebilirsiniz. Tüm bunları tamamladıktan sonra eğer
isterseniz Marker ayarları da yapabilirsiniz. Marker'lar bir
video içerisinde belirli bir konuma konan işaretçiler olarak değerlendirilebilir.
Site içerisinde Marker tanımlarken saniye ve açıklama bilgisi girmeniz
bekleniyor. Bu açıklamalar yaratılacak olan Silverlight Video Oynatıcısı
içerisinde ekstra olarak listelenecektir ve herhangi biri bu açıklamalardan
birine tıkladığında sizin ayarlamış olduğunuz videonun söz konusu saniyesindeki
konumuna dönülecektir.
Ayarlarınızı tamamladıktan sonra sitede Download düğmesine
tıklayarak bir ZIP dosyası olarak Silverlight Video
Oynatıcısı'nı bilgisayarınıza indirebilirsiniz. ZIP arşivi içerisindeki tüm
dosyaları bilgisayarınıza bir klasöre açarak aynı klasöre VMW dosyasını da
yerleştirdikten sonra istediğiniz hosting (barındırma) alanına dosyaları aynen
yükleyebilirsiniz. Böylece en ufak bir kod bile yazmadan, bilgisayarınıza hiçbir
ek program yüklemeden hızlı bir şekilde görsel bir Silverlight Video
Oynatıcısı'nı web sitenize eklemiş oldunuz.
Hepinize kolay gelsin...
Türkiye'nin ilk Silverlight webinerini daha önce de duyurduğum üzere bugün
gerçekleştirdik. Silverlight webinerimizi özellikle Expression Studio
çerçevesinde yeni webinerler takip ediyor olacak. Bizden ayrılmayın diyerek
aşağıda sizlerle webinerde kullandığımız sunum dosyasını paylaşarak varsa
Silverlight başlıklı sorularınızı bu yazıma yorum olarak gönderebileceğinizi de
hatırlatmak isterim.
Webiner Sunum Dosyası - 04102007_1.rar (6,39MB)
Türkiye'nin ilk Silverlight webinerini Microsoft'dan
Nuri Çankaya ile beraber yarın gerçekleştiriyor olacağız. Silverlight örneklerinden başlayarak Expression Design, Expression Blend ve Visual Studio 2005'in Silverlight dünyasındaki yerine, uygulamalı bir örnekle bakacağımız Webiner'e aşağıdaki bilgilerle kaydolabilirsiniz.
Adres:https://www112.livemeeting.com/cc/microsoft/join
Meeting ID: 2H5S37
Giriş Kodu: W@;%#d7:j
Tarih ve Saat: 4 Ekim 2007 Perşembe, Saat 10:00-12:00
Türkiye’den Türkçe olarak yapılacak bu webiner sonrası isteyenler, 15:30’da başlayacak olan dünyanın 10 merkezinde aynı anda yapılacak "Expression Around The Clock” etkinliğine katılabilirler. Expression ürün ailesine ait tüm tasarım araçlarının detaylarıyla anlatılacağı bu etkinliği yine internetten izleyebilirsiniz. Auckland – Seoul – Bangalore – Moscow – Cairo – Milan – Zürich - Sao Paulo – Toronto - Mexico City şehirlerinde gerçekleşecek etkinlikte Zürih açılış oturumunu Steve Ballmer gerçekleştirecek. Katılım detayları webiner sonunda verilecek.
Webinerler internet üzerinden online olarak gerçekleşiyor. Webineri izleyebilmek için öncesinde
http://go.microsoft.com/fwlink/?LinkId=90703 adresinden bilgisayarınızı test
etmenizde fayda var. Son olarak yaklaşık 15 MB civarında olan Office Live Meeting istemcisini
de bilgisayarınıza şimdiden kurarsanız son anda sorun yaşama ihtimalinden
kurtulursunuz.
İster internet üzerinden yayınlanan makalelerde olsun ister blog sitenize yollayacağınız bir ipucunda, maalesef sayfanıza HTML kodu veya herhangi bir kod yerleştirmek istediğinizde Visual Studio içerisinden alışık olduğumuz renklendirmeyi almamız pek mümkün olmuyor. Bu durumda çoğu sitede ekran görüntülerinden oluşan resimlerle dolu makaleler görüyoruz. Ben bugüne kadar bu sorunu biraz uğraştırıcı bir yöntemle çözüyordum :)
Bugünden sonra ise CopySourceAsHtml adındaki bir Visual Studio 2005 add-in uygulamasını kullanacağım. Yaptığım testlerde epey başarılı sonuçlar aldım. Uygulama direk Visual Studio içerisindeki renklendirme üzerinden HTML kodu yaratabiliyor. Programı aşağıdaki adresten indirebilirsiniz.
http://www.jtleigh.com/people/colin/software/CopySourceAsHtml/
Silverlight ile çalışmalarım yoğun olarak devam ediyor. Bu kapsamda DEVELOAD bünyesinde de Silverlight konusuna eğiliyoruz. Son dört senedir aynı web sitesini kullanmanın derdi ve biraz daha sade bir arayüz arayışı ile Silverlight'ın heyecanı da birleşince sonuç Türkiye'nin ilk kurumsal Silverlight uygulaması oldu.
http://www.deveload.com adresinden inceleyebileceğiniz site Silverlight 1.0 ve ASP.NET AJAX kullanılarak programlandı. Yazılım geliştirme süresince karşılaştığımız herşey bizi o kadar memnun etti ki maalesef bir daha Adobe Flash'a dönmeyi düşünmüyoruz. Silverlight hem XML tabanlı animasyon sistemi, hem de JavaScript ile programlanabiliyor olması ile gerçekten çok daha esnek. Tabi bahsetmeden de geçemeyeceğim, ziyaret edeceğiniz site arkaplanda bir içerik yönetim sistemine de bağlı.
Siteyle ilgili yorumlarınızı heyecanla bekliyorum ;)
Son zamanlarda yoğun olarak Silverlight üzerine çalışıyorum ve bir süredir güzelim Silverlight logosunu bloguma JPEG olarak koyuyor olmak canımı sıkıyordu. Diğer yandan blog sitemin de kaynak kodlarına girerek Silverlight JavaScript kodlarını yerleştirmeye de bir türlü zamanım olmadı. Fakat bugün uygun bir yol buldum. Size ilk önce Silverlight Streaming servislerinden bahsetmek istiyorum. Live.com üzerinden ulaşabileceğiniz servis şu an Alpha sürümünde. 4GB disk alanı kullanabildiğiniz hizmet ile kendi Silverlight uygulamalarınızın web üzerinde yayınlanabilmesini sağlayabiliyorsunuz. Sonrasında yayınladığınız Silverlight uygulamasını kendi web sitenize de yerleştirebilirsiniz. Ben de bu servislerden faydalanarak Silverlight logosunu doğrudan Silverlight Streaming servisleri üzerinden bloguma koyacağım. <iframe src="http://silverlight.services.live.com/invoke/32/SlLogo/iframe.html" frameborder="0" width="258" height="100" scrolling="no" /> Eğer siz de sitenize Silverlight logosunu aşağıdaki şekilde yerleştirebilmek istiyorsanız yukarıdaki kodu kullanabilirsiniz.
Yok böyle birşey! Biraz agresif bir giriş olduğunun farkındayım fakat insanları kısmen aptal yerine koyan ticari mantıktan artık bıkkınlık geldi. Silverlight'ın hayatımıza yeni yeni girmesinden faydalanan yerli ve yabancı bazı hosting şirketleri yeni hosting paketlerini bir gaz satışa sundular.
Silverlight Destekli Hosting!!! Yok böyle birşey! Böyle bir hizmet yok! Silverlight tamamen JavaScript ve XAML, 1.1 sürümünde ise .NET Framework. Bunların hepsi Silverlight Plug-In sayesinde tamamen istemci tarafında çalışan teknolojiler. Hosting sağlayıcınızın bunun için ek bir ayar yapmasına vs hiçbir şeye gerek yok. O nedenle Silverlight uygulamaları yayınlamayı düşünüyorsanız şu anki hosting hizmetinizle devam edebilirsiniz.
Silverlight sadece ASP.NET ile kullanılır. Hayır! Silverlight'ı isterseniz PHP, Coldfusion veya JSP ile kullanabilirsiniz. Hiçbir sınırlama yok. İsterseniz Linux sunucu üzerinden yayınlarsınız, isterseniz Windows veya BSD! Seçim tamamen size kalmış.
Silverlight ile ilgili akılda kalan başka sorular varsa lütfen yorum olarak bu mesaja ekleyin. Elimden geldiğince açıklık getirmeye çalışacağım.
Yazılım sektörü ile ilgili dünyadaki ve Türkiye'deki gelişmelerle ilgili ufak bir haber geçidi oluşturmaya karar verdim :) Gelin beraberce inceleyelim.
İlk haberimiz tabi ki Silverlight 1.0'ın çıkışı. Bu konuda daha önce de blog içerisinde bir yazı yazmıştım. O nedenle çok detaya girmeyeceğim. Özellikle bahsetmek istediğim bir diğer nokta da Moonlight; Microsoft ve Novell tüm Linux sürümlerinde çalışacak Silverlight sürümü için çalışma başlattıklarını duyurdu. Moonlight, FireFox, Konqueror ve Opera ile çalışacak. Gerçekten güzel günler bizi bekliyor.
Microsoft, Silverlight ile hazırlanmış yeni arama motorunu duyurdu: Tafiti.com. Günlük hızlı kullanım için ne kadar kullanışlı olduğu tartışılır fakat teknoloji demosu anlamında gerçekten çok başarılı. Silverlight'ın şu an 3D desteği olmadığı göz önünde alınarak 3D bir ortam 2D nesneler ile kısmen sağlanmış durumda. Arama motoru olarak arka planda live.com kullanılıyor. Live.com ile ilgili web servislerinin kullanımı konusundaki makaleme buradan ulaşabilirsiniz.
İnternette belirli bir metni veya web sayfasını bir dilden diğerine çevirmek istediğimizde genelde gittiğim adres altavista'nın Babel Fish uygulaması olurdu. Artık yeni bir alternatif var; Live Translator. Aşağıda adresi yer alan web sitesinden ulaşabileceğiniz site üzerinden belirli bir metni veya web adresi vererek bir web sitesini farklı dillere çevirtebilirsiniz. Türkçe desteğini de en kısa zamanda bekliyoruz :)
http://translator.live.com/
Türkiye'deki İlk Silverlight uygulaması da artık yayında. ODTÜ BÖTE Bölüm Başkanı Prof.Dr. M.Yaşar ÖZDEN tarafından hazırlanan Türkiye'nin ilk Silverlight uygulamasına aşağıdaki adresten ulaşabilirsiniz. Sayfa içerisinde 24 saat kesintisiz NTV canlı yayını verilmekte.
http://guide.ceit.metu.edu.tr/Expression/SilverLightTV/default.html
Şimdilik haberler bu kadar. Elimden geldiğince haberleri günü gününe değil de böyle topluca derlemeye çalışacağım.
WPF/E (WPF For Everywhere) kod adı ile tanıştığımız Silverlight'ın 1.0 sürümü Microsoft tarafından yayınlandı. Silverlight 1.0 ile beraber Expression Studio serisinden Expression Encoder'a ait de 1.0 sürümü yayınlandı. Arka planda JavaScript kodları yazarak WPF ile yarattığımız animasyonları tarayıcı bağımsız olarak kontrol edebildiğimiz Silverlight'ın bir sonraki sürümünde .NET kodu yazabiliyor olacağız. Açıkcası ben heyecanla bir sonraki sürümü bekliyorum.
Silverlight 1.0 kullanılarak hazırlanmış sitelere örnek olarak aşağıdaki linkleri inceleyebilirsiniz.
http://www.tafiti.com
http://halo3.msn.com/videos.aspx
http://election.msn.com/podium08.aspx
Silverlight ile ilgili uzun süredir herhangi bir yazı yazmadığımın farkındayım. Açıkcası Beta sürecinde olan yazılımlarla ilgili çok derin çalışmalar yapmanın biraz sakıncalı yönleri var. Bu yönleri özellikle ATLAS.NET ile çalıştıktan sonra üzücü bir şekilde farkında vardım. Öğrendiğiniz herşey bir anda uçup gidebiliyor veya bir anda öyle değişiklikler oluyor ki kendiniz söz konusu konu ile alakasız zannetmeye başlayabiliyorsunuz. O nedenle en azından RC sürümüne kadar sessiz bir bekleyişin daha uygun olacağını düşünüyordum.
Tabi bu arada sizler boş durmamış ve aynı benim gibi sessiz sessiz Silverlight çalışıyor da olabilirsiniz. İşte bu noktada Silverlight Beta ile RC uygulamaları arasındaki farkların anlatıldığı bir MSDN makalesini sizlerle paylaşmak istiyorum.
http://msdn2.microsoft.com/en-us/library/bb693297.aspx RC sürümünden itibaren artık çok büyük değişiklikler beklemiyor, fakat yine de hazırlıklı olmakta ve gelişmeleri yakından takip etmekte fayda var. Ne de olsa daha Visual Studio 2008 için en az 6 ayımız var :)
 WPF (Windows Presentation Foundation) Windows Vista ile dahili olarak gelen .NET Framework 3.0'ın önemli parçalarından biri. Ses, video ve animasyonun beraber olarak kullanılabildiği XAML (XML bazlı) kodlarının gerçek zamanlı olarak render edilmesi ile oluşturulan uygulamaların altyapısını oluşturan WPF'in internet üzerinden kullanılabilecek sürümünü uzun zamandır kod adı WPF/E (WPF For Everywhere) ile takip ediyorduk. Şu an CTP (Community Technology Preview) aşamasında olan WPF/E'nin gerçek adı Microsoft tarafından duyuruldu; Silverlight. Silverlight'ın tam olarak ne olduğunu anlamak için esasen WPF'in ne olduğunu anlamak gerek. WPF özünde XAML (Extensible Application Markup Language) kodundan oluşan bir arayüz ve gerçek zamanlı 3D rendering desteğine sahip. XML kodu ile tanımlanan objeler üç boyutlu olarak yönetilebiliyor. Tüm bu sistemin çalışması için hedef makinede .NET Framework 3.0 yüklü olması şart.
Silverlight ise bu sistemin internet ortamına taşınmış şekli. Arka planda ASP.NET programlama desteği ve veri trafiği için de AJAX kullanımı ile kullanıcı taraflı üç boyutlu grafikler ile etkileyici web siteleri yakın gelecekte sıkça karşımıza çıkacak. Hemen aklınıza ilk gelen soru şöyle olacak; Peki ya .NET Framework 3.0 yüklü değilse site çalışmayacak mı? Aynı Adobe Flash Plug-in gibi ufak bir Plug-In yükleyerek Silverlight'ın sisteminizde çalışabilmesini sağlayabileceksiniz. Sistem tamamen platform (Windows, Mac) ve tarayıcı (IE, FireFox) bağımsız. Microsoft Silverlight sitesine aşağıdaki adresten ulaşabilirsiniz; http://www.microsoft.com/silverlight/default_01.aspx Ayrıca konuyla ilgili Microsoft tarafından bir topluluk sitesi de 30 Nisan'da yayına geçecek.
http://www.silverlight.net/ Bilgisayarınızda şu an Silverlight uygulamalarını çalıştırmak için gerekli Plug-In'i yukarıdaki Microsoft adresinden indirebilirsiniz. Fakat hatırlatmakta fayda var, şu an ürün CTP aşamasında olduğu için sorunlar içermesi olası.
|
Copyright © 2010 Daron Yöndem.
Tüm hakları saklıdır.
|
|