Professional Documents
Culture Documents
Prakata
Pada saat pertama kali Anda membuka buku ini dan membaca prakata ini, maka hal
pertama yang hendak kami katakan adalah bahwa buku setebal 180 halaman ini adalah
buku yang jauh dari sempurna. Pembelajaran adalah sesuatu yang kontinyu dan
berkelanjutan dan buku ini hadir sebagai referensi yang menemani rekan-rekan
komunitas yang hendak mempelajari WPF.
Seperti apa yang kami katakan, buku ini adalah buku bertipe referensi, Anda akan
menemukan sekumpulan fakta di WPF, sekumpulan kode, dan sekumpulan jargon-
jargon tentang WPF, yang akan membuka khasanah Anda tentang WPF. Sebuah hal yang
hendak kami tekankan pada seri buku Just Code It®, adalah kami menekankan
penggunaan buku ini bersama-sama dengan training kit Visual Studio 2008 yang dapat
Anda unduh di situs Geeks dengan alamat
http://geeks.netindonesia.net/files/folders/trainingkit/default.aspx
Buku ini tiada akan hadir tanpa bantuan Findra, yang telah menggabungkan, menyusun,
dan menyempurnakan kaidah tata bahasanya. Seluruh anggota MIC-Gokilz. Mas Wely
yang selalu membantu dari sisi sumber daya dan semangat. Mas Naren yang selalu
menyempatkan waktu untuk mendengar, merasakan, dan memperhatikan setiap
langkah dan usaha pembuatan buku ini. Dan semua rekan-rekan yang tak dapat kami
sebut satu persatu.
Buku ini untuk Anda anggota komunitas, dan dari kami Anggota Komunitas
Salam Hangat,
Daftar Isi
Daftar Gambar
10 WPF, Just Code It!
Daftar Tabel
1 Pengenalan WPF
1.1 Tentang WPF
Inti dari WPF adalah sebuah mesin render yang berbasis vektor dan tidak bergantung
pada resolusi yang dibangun untuk memanfaatkan hardware grafis modern. WPF
memperluas intinya dengan sebuah set fitur pengembangan aplikasi yang menyeluruh
yang mencakup Extensible Application Markup Language (XAML), kontrol, data binding,
layout, grafik 2-D dan 3-D, animasi, styles, templates, dokumen, media, teks, dan
tipografi. WPF tercakup didalam Microsoft .NET Framework 3.0 atau yang lebih baru,
14 WPF, Just Code It!
Windows Presentation Foundation (atau WPF) adalah sebuah subsistem grafis didalam
.NET Framework 3.0 (atau yang lebih baru) dan berkaitan secara langsung dengan
bahasa aplikasi XAML. WPF tercakup dalam Windows Vista dan Windows Server 2008,
dan juga tersedia untuk Windows XP Service Pack 2 atau yang lebih tinggi, dan Windows
Server 2003. WPF menyediakan sebuah model pemrograman yang konsisten untuk
membangun aplikasi dan menyediakan pemisah yang jelas antara antarmuka pengguna
dan logika bisnis. Sebuah aplikasi WPF dapat dipasang pada komputer desktop atau di-
host didalam sebuah web browser. Teknologi ini juga memungkinkan kontrol, desain,
dan pengembangan aspek-aspek visual dari program-program Windows. WPF mencoba
untuk menyatukan host layanan aplikasi: antarmuka pengguna, gambar 2D dan 3D,
dokumen-dokumen tetap dan adaptif, tipografi tingkat lanjut, diagram vektor, diagram
raster, animasi, pengikatan data, audio dan video. Walaupun WinForms akan terus
digunakan secara luas, dan Microsoft hanya menciptakan sedikit aplikasi WPF, banyak
berbagai studi kasus mempromosikan WPF untuk aplikasi-aplikasi lini bisnis.
Semua grafis (termasuk item desktop seperti windows) adalah aplikasi Direct3D.
Direct3D bukan bermakna bahwa semua tampilannya harus berantarmuka tiga dimensi.
Pada bagian ini WPF melakukan enkapsulasi Direct3D dengan memberikan berbagai
fitur di antaraya.
1.2.2 Interoperabilitas
WPF memberikan bangun primitive untuk grafis 2D bersama dengan seperangkat kuas,
pena, geometri, dan transformasi yang built-in. Kemampuan 3D didalam WPF
merupakan sebuah subset dari seperangkat fitur lengkap yang disediakan oleh Direct3D.
Meskipun demikian, WPF memberikan integrasi yang lebih ketat dengan fitur-fitur lain
seperti user interface (UI), dokumen, dan media. Hal ini memungkinkan untuk memiliki
UI 3D, dokumen 3D, dan media 3D.
Pada WPF Terdapat dukungan untuk sebagian besar format gambar umum yang telah
distandarisasi. WPF mendukung juga format video WMV, MPEG dan beberapa berkas
AVI. Pada pendekatan ini WPF juga mendukung animasi berbasis waktu, sebagai lawan
dari pendekatan berbasis frame. Hal ini mengurangi kecepatan animasi dari bagaimana
sistem bekerja.
Seperangkat kontrol yang built-in diberikan sebagai bagian dari WPF. Kontrol ini
memuat berbagai item-item seperti tombol, menu, dan list box. Hal yang mungkin
dinotifikasi adalah salah satu kontrol WPF yangtidak memiliki kontrol penampil data
berupa DataGrid, namun demikian vendor-vendor pihak ketiga telah menawarkan
beberapa kontrol tersebut, atau bahkan Anda dapat memperoleh kontrol tersebut
tanpa investasi.
Hal yang menarik dan diterapkan pada konsep pemograman .NET adalah diterpkannya
konsep pemisah logis antara sebuah kontrol dari penampilannya.
1.2.6 Anotasi
Anotasi adalah kemampuan member informasi penandaan pada dokumen. Hal ini dapat
diterapkan pada basis per-obyek, untuk obyek-obyek didalam sebuah Document atau
FlowDocument. WPF hanya memberikan kemampuan untuk menciptakan, menyimpan
dan mengelola anotasi; masing-masing aplikasi harus mengekspos perancanfan
antarmuka sendiri.
1.2.7 Imaging
WPF secara natif dapat mengakses pustaka standar Windows Imaging Component (WIC)
dan API yang memungkinkan pengembang untuk menuliskan kodek gambar untuk
format berkas gambar yang telah distandarisasi.
18 WPF, Just Code It!
1.2.8 Efek
1.2.9 Dokumen
WPF secara natif mendukung dokumen-dokumen layaknya seperti dokumen word. WPF
menyediakan sebuah kelas yang diberi DocumentReader, yang digunakan untuk
membaca dokumen-dokumen dengan layout tetap. Kelas FlowDocumentReader
menawarkan mode-mode tampilan yang berbeda seperti per-halaman atau dapat di-
skrol dan juga menyusun kembali teks jika area tampilan diubah ukurannya.
Konsep halaman-halaman pada dokumen WPF ini mengikuti standar XML Paper
Specification, serta mendukung pembacaan dan penulisan dokumen-dokumen
berhalaman menggunakan Open Packaging Convention.
1.2.10Teks
WPF mencakup sejumlah fitur penampilan teks dan tipografi yang sebelumnya tidak
tersedia didalam GDI. Teknologi WPF ini menghadirkan antarmuka pemrograman
Windows yang pertama untuk mengekspos fitur-fitur OpenType. OpenType adalah
teknologi skalabilitas suatu ukuran font pada layar komputer.
WPF menangani teks dalam standar Unicode, dan menangani independesi teks dari sisi
pengaturan global dari sistem Windows. Pada pengelolaan teks terdapat fitur-fitur
menarik yakni.
19 WPF, Just Code It!
Pengelolaan tekas pada WPF juga mendukung pemeriksaan ejaan yang built-in.
Pengelolaan teks WPF ini mendukung fitur-fitur seperti spasi otomatis, teks
internasional berbahasa inggris, pemisahan baris, penyambungan kaya, perataan
paragraf, efek-efek bitmap, tranformasi font, dan efek-efek teks ala animasi seperti
bayangan, samar (blur), glow, rotasi, dsb. Berbagai macam efek tersebut memungkinkan
pengembangan teks beranimasi yang bersifat real-time.
1.2.11Input Alternatif
WPF mendukung fungsionalitas yang terkait dengan tinta digital. Input tinta digital ini
mengadopsi dukungan teknologi Windows Ink Services Platform (WISP) yang sudah
dikenal pada implementasi tablet PC di tahun 2005 silam. Hal yang menarik dari WISP ini
adalah mengkombinasikan dan mengenkapsulasi teknologi input alternatif yang
ditanamkan saat ini pada Windows Vista
1.2.12Aksesabilitas
Seluruh komponen yang bersifat natif tersebut kemudian di kelola oleh sebuah
komponen natif yakni PresentationCore (presentationcore.dll). Komponen ini
memberikan sebuah wrapper terkelola untuk MIL dan mengimplementasikan layanan
inti untuk aplikasi WPF, sebuah sistem properti pengambilan nilai variable ala WPF, dan
sistem pengiriman pesan untuk implementasi servis event di antarmuka pengguna.
Komponen lain adalah komponen yang dikenal dengan PresentationFramework
(presentationframework.dll). PresentationFramework ini mengimplementasikan fitur-
fitur antarmuka pengguna akhir, termasuk layout, animasi berbasis story-board, serta
pengikatan data.
21 WPF, Just Code It!
WPF mengekspos sebuah sistem properti untuk obyek-obyek yang diturunkan dari
DependencyObject. Sistem properti ini memiliki dukungan ketergantungan antar
konsumen dari property tersebut, hal ini mendukung pemicuan aksi-aksi berdasarkan
pada perubahan-perubahan didalam properties. Properties dapat berupa nilai atau
ekspesi yang dikodekan secara tegas, yang merupakan ekspresi-ekspresi khusus yang
memberikan sebuah hasil. Nilai dari properties tersebut juga dapat diturunkan dari
obyek-obyek induk. WPF properties mendukung notifikasi perubahan, yang memanggil
perilaku-perilaku bawaan kapanpun property dari elemen berubah. Perilaku khusus
dapat digunakan untuk menyebarkan notifikasi perubahan property dalam set obyek
WPF. Perilaku ini digunakan oleh sistem layout untuk memicu kalkulasi kembali dari
layout pada perubahan property, yang mengekspos sebuah gaya pemrograman
deklaratif untuk WPF, dimana hampir segalanya, dari pengaturan warna dan posisi
untuk elemen-elemen yang beranimasi dapat dicapai dengan setting properties. Hal ini
mengijinkan aplikasi-aplikasi WPF untuk ditulis dalam XAML, yang merupakan sebuah
bahasa mark-up yang deklaratif, dengan mengikatkan keyword dan atribut secara
langsung ke kelas dan property dari WPF.
22 WPF, Just Code It!
MIL menggunakan algoritma painter, dimana semua komponen dirender dari balik layar,
yang memungkinkan efek-efek kompleks seperti transparansi agar mudah dicapai.
Proses render ini diperkuat oleh hardware menggunakan GPU. Pohon komposisi yang
tersusun oleh MIL, yang menciptakan sebuah mode grafis yang ditahan, sehingga
perubahan apapun pada pohon komposisi hanya perlu dikomunikasikan kepada MIL
secara bertahap. Hal ini juga membebaskan aplikasi untuk mengelola penggambaran
layar kembali, MIL dapat melakukannya sendiri ketika ia memiliki semua informasi yang
diperlukan.
Render dan repaint dikelola oleh WPF sendiri, tanpa campur tangan apapun dari
pengembang. Thread UI mengembalikan Dispatcher (melalui sebuah instan dari
DispatcherObject), yang mengelola sebuah antrian dari operasi-operasi UI yang perlu
dilakukan (sebagai sebuah pohon dari obyek-obyek Visual), yang diurutkan berdasarkan
prioritas. Event-event UI, termasuk mengubah sebuah property yang mempengaruhi
layout, dan event interaksi pengguna yang dibangkitkan diantrikan didalam dispatcher,
yang memanggil handlers untuk events tersebut.
1.4 Kesimpulan
Pada tahap ini mungkin Anda sudah tidak sabar lagi untuk melakukan pengkodean, dan
ingin melepas semua teori tentang WPF sebagai latar belakang pengembangan aplikasi.
24 WPF, Just Code It!
Penulis menyadari pengetahuan pada bagian ini mungkin bersifat teoritis, tapi penulis
meyakini bahwa manfaat dari bab ini akan membantu Anda memutuskan suatu teknik
pemograman yang mengoptimalkan teknologi WPF. Bukankah mengenal suatu medan
pertempuran akan memudahkan Anda memenangkannya, dan bab inilah yang
mengenalkan medan oerang WPF pada Anda.
25 WPF, Just Code It!
XAML adalah salah satu bahasa implementasi yang mengikuti permodelan keberhasilan
bahasa markup untuk pengembangan web. WPF memperkenalkan sebuah bahasa baru
yang dikenal sebagai eXtensible Application Markup Language (XAML), yang
berdasarkan pada XML. XAML dirancang sebagai sebuah metode yang lebih efisien
untuk mengembangkan antarmuka pengguna aplikasi.
Keuntungan khusus yang dibawa XAML bagi WPF adalah bahasa yang dihasilkan
menggunakan mekanisme deklaratif. Pada bahasa pemrograman yang deklaratif,
pengembang (atau perancang) mendeskripsikan perilaku dan integrasi dari komponen-
komponen tanpa penggunaan pemrograman prosedural. Hal ini memungkinkan bagi
seseorang dengan sedikit atau tanpa pengalaman pemrograman untuk membuat
seluruh aplikasi kerja tanpa pemrograman. Walaupun secara umum jarang sekali
ditemukan sebuah aplikasi yang dibangun secara menyeluruh dalam XAML, pengenalan
XAML mengijinkan perancang aplikasi untuk berkontribusi secara lebih efektif pada
siklus pengembangan aplikasi. Penggunaan XAML untuk mengembangkan antarmuka
pengguna juga mengijinkan pemisahan model dan tampilan, dan hal ini merupakan
sebuah prinsip arsitektural yang baik. Pada XAML, elemen-elemen dan atribut-atribut
dipetakan ke kelas-kelas dan property-properti dalam API dasar.
Seperti di dalam pengembangan web, baik layout maupun theme yang khusus dapat di-
markup untuk aplikasi WPF, namun XAML tidaklah dibutuhkan secara penuh. Semua
element WPF dapat dikodekan dalam bahasa .NET (C#, VB.net). Kode XAML pada
akhirnya dapat dikompilasi kedalam sebuah kode terkelola dengan cara yang sama
dengan semua bahasa .NET. Pada point ini meyakinkan bahwa penggunaan XAML untuk
pengembangan tidak menambah beban performa. XAML juga dapat dikompilasi dan
dijalankan secara "on demand" mirip dengan halaman web HTML.
26 WPF, Just Code It!
Walaupun XAML telah diperkenalkan sebagai sebuah bagian integral dari WPF, stAndard
XAML sendiri tidak menjadi khusus bagi WPF (atau bahkan .NET). XAML juga dapat
digunakan untuk mengembangkan aplikasi-aplikasi menggunakan berbagai API
pemrograman lain dan tidak bergantung pada bahasa tertentu. Meskipun demikian,
penelitian khusus telah dilakukan dalam mengembangkan API WPF untuk
memaksimalkan interoperabilitas dengan model deklaratif yang diperkenalkan oleh
XAML.
Banyak aplikasi, seperti Microsoft PowerPoint dan Word, akan mendukung ekspor
konten mereka ke XAML.
Ada juga profil-profil yang spesifik untuk Workflow Foundation, dan subset-subset
khusus domain lainnya mungkin akan bermunculan dimasa mendatang.
pemisahan kode antara presentation layer dan business logic layer mengijinkan
pengembangan yang terpisah antara desainer dan developer.
WPF mendukung tiga jenis aplikasi, yaitu Windows applications, Navigation applications,
dan XAML Browser Applications (XBAPs). Masing-masing jenis aplikasi tersebut memiliki
kelebihan dan kelemahan masing-masing.
Windows application terdiri dari satu atau lebih jendela dan business logic yang terkait.
Elemen UI level teratas dari sebuah jendela adalah sebuah kelas yang diturunkan dari
kelas Window. Kelas Window diturunkan dari ContentControl, yang berarti bahwa ia
dapat memuat sebuah elemen tunggal didalam properti Content-nya. Elemen ini
biasanya merupakan sebuah kontrol layout yang dapat memuat banyak kontrol anak.
1. Didalam Visual Studio, pilih menu File > New > Project.
2. Terbuka kotak dialog New Project.
3. Didalam kotak dialog New Project, pilih WPF Application, berikan sebuah nama
(misalnya WindowsAppSample), dan klik OK.
28 WPF, Just Code It!
Didalam Visual Studio IDE untuk aplikasi WPF, Toolbox, Properties, Designer, dan
Solution Explorer sangat mirip dengan Windows Forms designer. Yang baru disini adalah
XAML view yang terletak dibawah designer. XAML view mengijinkan Anda untuk
mengedit XAML yang mendefinisikan jendela didalam designer.
29 WPF, Just Code It!
Gambar 2.2 Sebuah Windows application baru didalam Visual Studio IDE
Penetapan nilai properti Window dapat dilakukan dengan salah satu dari dua cara
berikut ini:
1. Pada saat desain dengan memilih jendela didalam designer dan menetapkan
properti yang sesuai didalam jendela Properties.
2. Mengedit XAML untuk jendela tersebut didalam XAML view.
Contoh berikut mendemonstrasikan pengaturan properti WindowsState (dalam
kotak hijau) dengan mengaturnya didalam XAML untuk jendela:
Sebuah navigation application adalah sebuah aplikasi desktop yang menggunakan obyek
Page sebagai obyek primernya, bukan sebuah obyek Window objects. Seperti obyek
Window, obyek Page dapat memuat sebuah kontrol tunggal. Kontrol ini biasanya adalah
sebuah kontrol Grid atau beberapa kontrol berbasis layout lainnya, yang mengijinkan
penempatan banyak kontrol anak untuk pembentukan UI.
Navigation application di-host didalam sebuah jendela Navigation dan dapat dijalankan
dengan mudah dibawah full trust, sehingga aplikasi ini ideal untuk deployment didalam
lingkungan yang aman.
2.2.1.3 XBAP
31 WPF, Just Code It!
XBAP mirip dengan Navigation applications, namun aplikasi ini dirancang untuk berjalan
didalam Windows Internet Explorer. XBAP juga menggunakan obyek Page sebagai obyek
UI level teratas, dan XBAP mengijinkan model navigasi berbasis halaman seperti
penggunaan sebuah Web site. XBAP dirancang untuk berjalan didalam Internet Explorer
dan pengguna tidak perlu menyalinnya kedalam hard drive. Aplikasi ini dapat dipasang
ke sebuah server atau ke sebuah Web site dan diunduh ketika diinstansiasi.
Perbedaan utama antara XBAP dan Navigation application adalah bahwa XBAP tidak
diinstal. Karena XBAP tidak diinstal, maka ia berjalan dibawah ijin yang terbatas. Secara
umum, XBAP akan berjalan dibawah ijin yang diperbolehkan oleh zona Internet dari
Internet Explorer. Sehingga, XBAP yang berjalan dibawah kondisi stAndard tidak dapat
menggunakan file system, tidak dapat mengakses basis data, registry, dan secara umum
dilarang menggunakan sumber daya sistem yang berdampak pada resiko keamanan.
Secara teknis, XBAP dapat dijalankan dengan full trust, namun hal ini tidak
direkomendasikan karena hal tersebut memberikan akses penuh atas sumber daya
sistem Anda bagi sebuah aplikasi dari lokasi yang tidak terpercaya, sehingga
menciptakan sebuah resiko keamanan. XBAP hanya ideal untuk distribusi luas.
Web browser yang mendukung XBAP adalah Internet Explorer 6.0 dan versi diatasnya.
Untuk membuka sebuah XBAP, ada 2 cara:
Seperti yang telah disebutkan sebelumnya bahwa XBAP dilarang mengakses file system,
registry, dll. Namun XBAP diijinkan untuk mengakses isolated storage. Ukuran dari
isolated storage relatif kecil (512 kilobytes), namun ia bisa sangat berguna untuk
membaca dan menulis preferensi pengguna dan data terkait lainnya.
Untuk membaca dari dan menulis ke isolated storage, Anda dapat menggunakan kelas-
kelas StreamReader dan StreamWriter, caranya:
Ketika memilih sebuah jenis aplikasi WPF, pertimbangkan konteks keamanan dimana
aplikasi akan dijalankan. Dengan Windows applications dan Navigation applications yang
diinstal pada komputer desktop, Anda menjadi lebih leluasa karena keduanya dapat
berjalan dibawah full trust atau kebijakan keamanan lainnya yang telah ditentukan oleh
administrator. Sedangkan XBAP sangat dibatasi oleh batasan keamanan dari Internet
security zone. Dibawah Internet security settings stAndard, Anda tidak dapat mengakses
file system, registry, basis data lokal, menciptakan jendela stand-alone (seperti kotak
dialog), menggunakan fungsionalitas drag-and-drop Windows dan WCF Web services.
Pada bagian ini kita akan mempelajari lebih dalam lagi tentang aplikasi berbasis
halaman.
Aplikasi berbasis halaman adalah aplikasi navigation-driven, yang mana aliran program
dikemudikan dengan navigasi pada halaman-halaman aplikasi. Aplikasi model ini tidak
cocok untuk beberapa aplikasi yang membutuhkan interaksi yang alirannya random,
namun cocok untuk aplikasi-aplikasi yang berfokus pada sebuah tugas tunggal, seperti
aplikasi kereta belanja atau wizard.
Sebuah frame adalah host untuk halaman XAML atau halaman Web dan ia meletakkan
dirinya sendiri didalam sebuah halaman atau jendela. Jadi selain selain kedalam Internet
34 WPF, Just Code It!
Untuk meletakkan halaman kedalam sebuah frame, akses melalui properti Source dari
kontrol Frame yang mengindikasikan halaman yang dimuat kedalam frame. Contoh kode
dalam XAML:
Hyperlinks adalah metode yang paling umum digunakan untuk bernavigasi didalam
aplikasi berbasis halaman. Ketika hyperlink di-klik, aplikasi bernavigasi ke halaman yang
ditunjuk oleh hyperlink tersebut.
Hyperlink adalah elemen inline flow, yang berarti bahwa hyperlink harus diletakkan
didalam elemen lain yang mendukung elemen inline flow, seperti elemen TextBlock.
Ketika sebuah hyperlink diklik, sebuah instan baru dari halaman target diciptakan dan
aplikasi bernavigasi ke halaman tersebut. Hyperlink juga dapat menunjuk ke sebuah
PageFunction, namun mustahil untuk mengembalikan sebuah nilai dari PageFunction
menggunakan hyperlink.
Berikut adalah kode untuk hyperlink dengan target halaman WPF lainnya didalam XAML:
Berikut adalah kode untuk hyperlink dengan target halaman Web didalam XAML:
35 WPF, Just Code It!
Agar target navigasi dari sebuah hyperlink dapat disesuaikan dengan kondisi, maka
tetapkan properti NavigateUri secara dinamis didalam kode. Berbeda dengan
penetapan target secara statis, Anda harus menetapkan properti Name dari hyperlink
didalam XAML, seperti:
Jika halaman target dari sebuah hyperlink dapat di-scroll (di-host didalam Internet
Explorer atau menggunakan kontrol ScrollViewer), Anda dapat menggunakan navigasi
fragment untuk menspesifikasikan sebuah elemen didalam halaman target.
Spesifikasikan elemen dengan menambahkan tAnda # yang diikuti dengan nama
elemen, yaitu:
Hyperlinks menyediakan sebuah cara yang cukup mudah untuk bernavigasi antar
halaman, namun untuk model navigasi yang lebih rumit, kelas NavigationService
menyediakan kontrol yang lebih baik.
36 WPF, Just Code It!
NavigationService memiliki sebuah metode yang disebut Navigate yang digunakan agar
aplikasi bernavigasi ke halaman target. Untuk menggunakan metode ini, ada dua cara:
2. Menciptakan sebuah instan dari sebuah halaman baru didalam memory dan
memberikannya ke metode Navigate, seperti:
Dengan cara pertama, maka jurnal aplikasi dapat menyimpan data halaman tanpa harus
menyimpan seluruh obyek halaman didalam memory, sehingga memory overhead
menjadi lebih rendah daripada menggunakan cara kedua. Sedangkan dengan cara
kedua, Anda dapat melewatkan informasi antar halaman yang tidak dapat dilakukan
dengan cara pertama.
Fungsi lain yang disediakan oleh NavigationService adalah untuk merefresh halaman
dengan memanggil Navigation-Service.Refresh, fungsi untuk bernavigasi maju didalam
jurnal menggunakan NavigationService.GoForward dan navigasi mundur menggunakan
NavigationService.GoBack. Contoh:
37 WPF, Just Code It!
NavigationService juga memiliki dua properti boolean yang bernama CanGoBack dan
CanGoForward, yang dapat Anda gunakan untuk memeriksa apakah aplikasi dapat
bernavigasi maju atau mundur. Contoh:
Navigasi bersifat asinkron. Oleh karenanya, Anda dapat membatalkan navigasi sebelum
ia selesai dengan memanggil NavigationService.StopLoading, seperti:
Gunakan NavigationService ketika Anda ingin menggunakan jurnal, atau ingin dapat
menghentikan atau mengubah navigasi secara programatik.
Jurnal adalah sebuah teknologi built-in kecil didalam XBAPs dan Navigation applications
yang menyimpan daftar dari halaman-halaman yang telah dikunjungi dan mengijinkan
Anda untuk bernavigasi atas daftar ini.
Anda dapat menggunakan properti CanGoBack untuk menghapus semua item didalam
jurnal, seperti:
Berikut adalah ikhtisar prosedur tingkat tinggi yang mendeskripsikan protokol umum
untuk menambahkan entri-entri jurnal khusus.
Navigasi didalam aplikasi WPF terjadi secara asinkron. Oleh karenanya, metode
NavigationService.Navigate akan kembali sebelum navigasi selesai. NavigationService
mendukung beberapa event yang mengijinkan aplikasi Anda bereaksi pada titik-titik
yang berbeda didalam proses navigasi. Event-event NavigationService aktif ketika
navigasi terjadi melalui NavigationService atau melalui klik hyperlink.
40 WPF, Just Code It!
Anda dapat menangani event-event ini untuk menyediakan validasi khusus, untuk
mengupdate kemajuan navigasi, atau untuk menambahkan fungsionalitas navigasi
khusus lainnya yang dibutuhkan. Berikut adalah event-event navigasi yang didukung
oleh NavigationService.
Sebagai contoh, Anda mungkin melewatkan informasi time stamp, atau obyek yang
dapat digunakan untuk memvalidasi permintaan halaman. Untuk melewatkan informasi
tambahan ke event handlers, tinggal panggil salah satu overloads dari
NavigationService.Navigate yang mengambil sebuah parameter obyek tambahan,
seperti:
Kelas PageFunction sangat mirip dengan kelas Page. Perbedaan yang prinsip antara
obyek-obyek Page dan obyek-obyek PageFunction adalah bahwa obyek-obyek
PageFunction dapat mengembalikan sebuah nilai. Hal ini mengijinkan Anda untuk
menciptakan halaman-halaman yang berperilaku sama dengan kotak dialog – mereka
dapat mengumpulkan informasi pengguna dan kemudian mengembalikan informasi
tersebut ke halaman utama.
1. Pilih menu Project > Add New Item. Terbukalah kotak dialog Add New Item.
2. Didalam kotak dialog Add New Item, pilih PageFunction (WPF). Beri nama
PageFunction Anda dan klik Add.
Sebuah PageFunction dapat mengembalikan segala tipe obyek .NET, namun secara
default obyek tersebut bertipe String. Anda dapat mengubah tipe balikan obyek dari
PageFunction, seperti integer atau sebuah object.
42 WPF, Just Code It!
1. Didalam XAML view, cari baris didalam PageFunction XAML sebagai berikut:
3. Didalam Code view, cari deklarasi kelas dan ubah tipenya, dari:
menjadi
Agar PageFunction Anda mengembalikan sebuah nilai, Anda harus memanggil metode
OnReturn. Metode OnReturn mengambil parameter dari tipe yang dispesifikasikan untuk
PageFunction. Anda juga dapat mengembalikan null untuk parameter ini jika tidak ada
nilai balikan yang dibutuhkan. Halaman yang dinavigasikan ke PageFunction harus
menangani event Returned untuk PageFunction tersebut. Instan dari ReturnEventArgs
yang dikembalikan oleh event tersebut memuat nilai yang dikembalikan.
Navigasi sederhana adalah sebuah model desain umum didalam aplikasi-aplikasi ringan
berbasis halaman. Umumnya tidak ada atau hanya ada sedikit percabangan. Model ini
hanya cocok untuk beberapa jenis aplikasi, seperti wizard konfigurasi, namun jenis
aplikasi lainnya mungkin menganggap model ini kurang memadai.
Sebagai contoh adalah sebuah aplikasi kereta belanja. Seorang pengguna mungkin
menambahkan barang ke kereta belanja, kembali ke galeri untuk melihat beberapa
barang, menambahkannya ke kereta belanja, mengulangi hal ini beberapa kali lagi, dan
kemudian keluar. Navigasi sederhana tidak akan cukup untuk menangani kasus ini.
3. Didalam konstruktor jendela atau halaman Anda, tambahkan kode untuk merelai
event ke handler.
4. Ditempat lain didalam kode Anda, mulailah operasi yang menghabiskan waktu
pada sebuah thread terpisah dengan memanggil metode RunWorkerAsync.
45 WPF, Just Code It!
Proses background Anda mungkin membutuhkan satu atau lebih parameter, seperti
alamat dari sebuah berkas untuk diunduh. Anda dapat memberikan sebuah parameter
didalam metode RunWorkerAsync yang akan tersedia sebagai properti Argument dari
instan DoWorkEventArgs didalam DoWork event handler.
Jika proses Anda membutuhkan lebih dari sebuah parameter tunggal, Anda mungkin
perlu membungkus banyak nilai dalam sebuah array khusus.
Anda mungkin ingin mengembalikan sebuah nilai dari sebuah proses background. Anda
dapat melakukannya dengan mengatur properti Result dari DoWorkEventArgs didalam
DoWork event handler. Nilai ini akan tersedia didalam RunWorkerCompleted event
handler sebagai properti Result dari parameter RunWorkerCompletedEventArgs.
46 WPF, Just Code It!
Anda dapat memanggil metode CancelAsync untuk mencoba membatalkan operasi; hal
tersebut menetapkan properti CancellationPending dari komponen BackgroundWorker
menjadi True.
Anda dapat melaporkan progres dari proses background dengan memanggil metode
ReportProgress. Metode ini membangkitkan event BackgroundWorker.ProgressChanged
dan mengijinkan Anda untuk melewatkan sebuah parameter yang mengindikasikan
persentase dari progres yang telah diselesaikan ke metode yang menangani event
tersebut.
48 WPF, Just Code It!
Kadang kala, Anda mungkin ingin mengubah UI dari sebuah thread pekerja. Sebagai
contoh, Anda mungkin ingin untuk mengaktifkan atau menonaktifkan tombol-tombol
berdasarkan pada status dari thread pekerja, atau menyediakan laporan progres yang
lebih rinci daripada yang diijinkan oleh metode ReportProgess. Model thread WPF
menyediakan kelas Dispatcher untuk pemanggilan-pemanggilan lintas thread.
Dengan menggunakan Dispatcher, Anda dapat mengupdate UI Anda secara aman dari
thread-thread pekerja. Anda dapat mengambil sebuah referensi ke obyek Dispatcher
untuk sebuah elemen UI dari properti Dispatcher nya.
Dispatcher menyediakan dua metode prinsip yang akan Anda gunakan: BeginInvoke dan
Invoke. Kedua metode ini mengijinkan Anda untuk memanggil sebuah metode secara
aman pada UI thread. Metode BeginInvoke mengijinkan Anda untuk memanggil sebuah
metode secara asinkron, dan metode Invoke mengijinkan Anda untuk memanggil
49 WPF, Just Code It!
Obyek-obyek Freezable adalah sebuah tipe khusus dari obyek yang diturunkan dari kelas
Freezable. Obyek-obyek yang sebagian besar digunakan oleh sub sistem grafis ini,
seperti kelas Brush, bisa ada dalam dua keadaan: keadaan read-write (unfrozen) dan
keadaan read-only (frozen).
Selama sebuah obyek freezable tidak dalam keadaan frozen, ia dapat diubah didalam
kode. Sebuah obyek frozen dapat diakses secara aman oleh semua thread, karena ia tak
lagi read-write, tapi read-only. Dengan obyek frozen, performa menjadi meningkat
karena ia tak lagi harus menyediakan notifikasi perubahan ke obyek-obyek lain dimana
mereka bergantung. Meskipun demikian, sekali sebuah obyek menjadi frozen, ia tidak
50 WPF, Just Code It!
bisa menjadi unfrozen. Anda dapat membekukan sebuah obyek freezable dengan
memanggil metode Freeze, seperti:
2.4 Kesimpulan
Pada bagian ini telah didiskusikan permodelan pemograman yang dimiliki WPF.Bentuk
aplikasi WPF yang beragam memungkinkan Anda, untuk membuat sebuah aplikasi yang
dapat disesuaikan dengan kondisi klien namun menggunakan permodelan pemograman
yang hampir identik. Aplikasi berjendela ala Windows, Aplikasi berorientasi jurnal,
hingga aplikasi WPF yang berjalan di atas Internet Explorer, memberikan khasanah
pilihan pengembang untuk mengembangkan aplikasi yang lebih beragam namun efisien
dari sisi investasi belajar.
51 WPF, Just Code It!
Kontrol layout adalah kontainer yang menyediakan logika layout untuk kontrol-kontrol
yang dimuat. WPF menawarkan dukungan untuk berbagai gaya layout yang baru.
Beberapa kontrol khusus tambahan yang baru tersedia mengizinkan Anda untuk
menciptakan berbagai model layout. Bagian ini akan membahas Layout Kontrol, Panel-
panel Layout, dan Snaplines.
Kontrol didalam WPF mengelola layout dan posisi mereka sendiri dan berinteraksi
dengan kontainer mereka untuk menentukan posisi akhir mereka. Bagaimana kontrol
disusun didalam sebuah panel layout bergantung pada properti layout dari kontrol yang
dimuat. Properti HorizontalAlignment dan VerticalAlignment dari kontrol-kontrol anak
menentukan bagaimana sebuah kontrol diratakan dalam arah horizontal dan vertikal,
dan properti Margin mendefinisikan area ruang yang mengelilingi kontrol. Dampak dari
properti layout kontrol dapat berbeda bergantung pada kontrol dimana mereka
diletakkan. Berikut adalah beberapa properti penting dari layout kontrol yang dapat
Anda gunakan dalam akses dan modifikasi layout kontrol dalam UI aplikasi Anda:
WPF mencakup berbagai panel layout yang dapat digunakan untuk merancang UI Anda,
antara lain adalah Panel Grid, UniformGrid, StackPanel, WrapPanel, DockPanel dan
Canvas.
53 WPF, Just Code It!
Grid adalah panel yang paling umum digunakan untuk menciptakan UI didalam WPF.
Panel Grid mengizinkan Anda untuk menciptakan layout-layout yang bergantung pada
properti Margin, HorizontalAlignment, dan VerticalAlignment dari kontrol-kontrol anak
yang dimuatnya. Kontrol-kontrol yang diletakkan didalam sebuah kontrol Grid
digambarkan sesuai urutan mereka didalam markup atau kode, sehingga Anda dapat
menciptakan UI yang berlapis. Kontrol Grid mengizinkan Anda untuk mendefinisikan
baris dan kolom didalam grid. Kemudian Anda dapat menambahkan kontrol-kontrol
anak untuk menciptakan sebuah layout yang lebih terstruktur.
Kontrol GridSplitter mengizinkan pengguna untuk mengubah ukuran baris atau kolom
grid pada saat dijalankan. Kontrol GridSplitter tampil sebagai sebuah bar vertikal atau
horizontal antara dua baris atau kolom yang dapat dipindahkan oleh pengguna untuk
menyesuaikan ukuran baris atau kolom diantaranya. Kontrol ini mudah digunakan oleh
pengguna, hanya dengan drag and drop kontrol dari Toolbox, namun pengguna harus
melakukan sejumlah konfigurasi agar grid splitter dapat bekerja dengan benar.
54 WPF, Just Code It!
Kontrol StackPanel menyediakan sebuah model layout yang sederhana. Kontrol ini
menumpuk kontrol-kontrol yang dimuatnya sesuai urutan definisi mereka. Biasanya,
kontainer StackPanel menumpuk kontrol-kontrol secara vertikal. Anda juga dapat
menciptakan sebuah stack horizontal dengan menetapkan properti Orientation dengan
nilai Horizontal.
55 WPF, Just Code It!
Kontrol Canvas adalah sebuah kontainer yang mengizinkan pengaturan posisi yang
absolut dari kontrol-kontrol yang dimuatnya. Kontrol ini tidak memiliki logika layout dari
dirinya sendiri, dan semua kontrol yang dimuat diletakkan dengan dasar empat properti
yang tertempel: Canvas.Top, Canvas.Bottom, Canvas.Right, dan Canvas.Left. Nilai dari
masing-masing properti ini menunjukkan jarak antara tepi yang ditunjuk dari kontrol
Canvas dan tepi yang bersesuaian dari kontrol anak. Anda hanya dapat mendefinisikan
satu properti horizontal dan satu properti vertikal untuk masing-masing kontrol yang
dimuat. Oleh karena itu, Anda tidak dapat menetapkan nilai Canvas.Left dan
Canvas.Right untuk sebuah kontrol tunggal, tidak juga Canvas.Top dan Canvas.Bottom.
56 WPF, Just Code It!
3.1.3 Snaplines
Snaplines adalah alat peraga visual didalam Visual Studio Integrated Development
Environment (IDE) yang menyediakan umpan balik kepada pengembang ketika tepi
kontrol diratakan atau ketika konten kontrol diratakan. Anda dapat menggunakan
snaplines untuk meratakan kontrol dan konten didalam UI pada waktu perancangan.
Ketika Anda meletakkan kontrol secara manual dengan mouse didalam Designer,
snaplines muncul ketika tepi horizontal atau vertical dari kontrol ada dalam alignment.
Snaplines juga menunjukkan apakah konten diratakan, yang mengizinkan Anda untuk
meratakan konten dalam banyak kontrol.
3.2 Resources
Logical resources adalah obyek-obyek yang didefinisikan didalam XAML dan dapat
digunakan oleh elemen-elemen yang ada didalam aplikasi Anda. Elemen-elemen
didalam UI Anda dapat mengakses resource kapanpun dibutuhkan. Ada dua keuntungan
yang ditawarkan:
1. Reusabilitas.
57 WPF, Just Code It!
<Window.Resources>
<RadialGradientBrush x:Key="myBrush">
<GradientStop Color="CornflowerBlue" Offset="0" />
<GradientStop Color="Crimson" Offset="1" />
</RadialGradientBrush>
</Window.Resources>
58 WPF, Just Code It!
Jika Anda tidak menginginkan sebuah resource tersedia bagi seluruh Window, Anda
dapat mendefinisikannya didalam Resources collection dari sebuah elemen didalam
Window.
<Grid>
<Grid.Resources>
<RadialGradientBrush x:Key="myBrush">
<GradientStop Color="CornflowerBlue" Offset="0" />
<GradientStop Color="Crimson" Offset="1" />
</RadialGradientBrush>
</Grid.Resources>
</Grid>
Properti x:Key tidak harus unik dalam aplikasi, namun ia harus unik didalam Resources
collection dimana ia didefinisikan. Karenanya, Anda dapat mendefinisikan satu resource
didalam koleksi Grid.Resources dengan key myBrush dan resource lainnya didalam
koleksi Window.Resources dengan key yang sama.
Untuk mendefinisikan resources pada level elemen atau Window, Anda dapat
mendefinisikan resources yang dapat diakses oleh semua obyek didalam aplikasi
59 WPF, Just Code It!
<Application x:Class="WpfApplication2.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="Window1.xaml">
<Application.Resources>
<SolidColorBrush x:Key="appBrush" Color="PapayaWhip" />
</Application.Resources>
</Application>
3.3 Styles
Styles mengizinkan Anda untuk mendefinisikan gaya visual yang konsisten untuk aplikasi
Anda. Styles dapat dianalogikan dengan cascading style sheets (css) seperti yang
digunakan didalam halaman Hypertext Markup Language (HTML). Pada dasarnya Styles
60 WPF, Just Code It!
memberi tahu presentation layer untuk menggantikan sebuah tampilan visual yang baru
untuk tampilan visual yang standar.
Mendefinisikan sebuah skema warna dan ukuran standar untuk aplikasi Anda.
Mengubah UI secara keseluruhan dengan mudah.
Memberikan look and feel yang konsisten untuk aplikasi Anda dalam berbagai
situasi.
Menetapkan properties dan merelai event-event pada elemen-elemen UI
melalui aplikasi dari style-style tersebut.
Menciptakan elemen-elemen visual yang secara dinamis merespon perubahan-
perubahan properti melalui aplikasi triggers, yang mendengarkan perubahan
properti dan kemudian menerapkan perubahan style sebagai responnya.
Kelas Style memuat informasi tentang penetapan style sekelompok properti. Sebuah
Style dapat diciptakan untuk diterapkan ke sebuah instan tunggal dari sebuah elemen,
ke semua instan dari sebuah tipe elemen, atau lintas tipe elemen.
BasedOn: Menunjuk style lain dimana style ini mengacu. Properti ini sangat
berguna untuk menciptakan style-style yang diturunkan.
Resources: Memuat sekumpulan sumber daya lokal yang digunakan oleh style.
Setters: Memuat sekumpulan obyek-obyek Setter atau EventSetter. Obyek-obyek
ini digunakan untuk menetapkan properti atau event pada sebuah elemen
sebagai bagaian dari sebuah style.
TargetType: Menunjukkan tipe elemen yang dituju untuk style.
Triggers: Memuat sekumpulan obyek-obyek Trigger dan obyek-obyek terkait
yang mengizinkan Anda untuk mempersiapkan perubahan dalam UI sebagai
respon untuk perubahan-perubahan didalam properties.
61 WPF, Just Code It!
3.3.2 Setters
Property setters, yang direpresentasikan oleh tag <Setter> didalam XAML, mengizinkan
Anda untuk menetapkan properties dari elemen-elemen dengan nilai tertentu. Dua
properti penting dari sebuah Property Setter:
Element.PropertyName
Jika Anda ingin menciptakan sebuah style yang menetapkan sebuah properti pada
banyak tipe elemen yang berbeda, Anda dapat menetapkan style pada sebuah kelas
umum yang menurunkan elemen-elemen.
<Style>
<Setter Property="Control.Background" Value="Red" />
</Style>
62 WPF, Just Code It!
Style ini menetapkan properti Background dari semua elemen yang diturunkan dari
Control yang diterapkan.
Event setters (direpresentasikan oleh tag <EventSetter>) mirip dengan property setters,
namun mereka menetapkan event handlers. Dua properti penting dari sebuah
EventSetter:
Contoh:
Nilai dari properti Handler harus menspesifikasikan sebuah event handler yang masih
ada dengan signature yang tepat untuk tipe event dimana ia terhubung. Mirip dengan
property setters, format untuk properti Event adalah:
Element.EventName
Anda telah melihat implementasi yang paling sederhana dari sebuah style: sebuah
Setter tunggal diantara dua tag Style, namun Anda belum melihat bagaimana cara
menerapkan sebuah style ke sebuah element. Ada beberapa cara untuk menerapkan
sebuah style ke sebuah elemen atau ke elemen-elemen.
63 WPF, Just Code It!
Cara paling langsung untuk menerapkan sebuah style ke sebuah element adalah
pengaturan properti Style secara langsung didalam XAML. Contoh berikut
mendemonstrasikan pengaturan secara langsung properti Style dari sebuah elemen
Button:
Metode paling umum untuk pengaturan style adalah menciptakan style sebagai anggota
dari Resources collection dan kemudian menerapkan style tersebut ke element-elemen
didalam UI Anda dengan memilih resource. Contoh berikut mendemonstrasikan
penciptaan style sebagai bagian dari Windows.Resources collection:
<Window.Resources>
<Style x:Key="StyleOne">
<Setter Property="Button.Content" Value="Style defined in
resources" />
<Setter Property="Button.Background" Value="Red" />
</Style>
</Window.Resources>
Anda harus memberikan nilai key untuk Style yang Anda definisikan didalam Resources
collection. Kemudian Anda dapat menerapkan style tersebut ke sebuah elemen dengan
memilih resource, seperti:
64 WPF, Just Code It!
Keuntungan mendefinisikan Style didalam bagian Resources adalah bahwa Anda dapat
menerapkan Style tersebut ke banyak elemen hanya dengan memilih resource.
Anda dapat menerapkan sebuah style ke semua objek dari sebuah kontrol dengan
menetapkan properti TargetType ke tipe yang sesuai. Ketika Anda menetapkan properti
TargetType pada sebuah Style, Style tersebut diterapkan ke semua elemen dari tipe
tersebut secara otomatis. Anda tidak perlu menspesifikasikan nama tipe yang
memenuhi kualifikasi didalam properti Property dari Setters apapun yang Anda
gunakan—Anda dapat langsung merujuk ke nama properti. Ketika Anda
menspesifikasikan TargetType untuk sebuah Style yang telah Anda definisikan didalam
sebuah Resources collection, Anda tidak perlu memberikan sebuah nilai key untuk style
tersebut. Contoh berikut mendemonstrasikan penggunaan properti TargetType:
<Window.Resources>
<Style TargetType="Button">
<Setter Property=" Content" Value="Style set for all buttons" />
<Setter Property="Background" Value="Red" />
</Style>
</Window.Resources>
Ketika Anda menerapkan properti TargetType, Anda tidak perlu menambahkan markup
tambahan apapun ke elemen-elemen bertipe tersebut untuk menerapkan style.
Jika Anda ingin elemen individu dikeluarkan dari style, Anda dapat menetapkan style
pada elemen tersebut secara eksplisit, seperti:
Contoh ini secara eksplisit menetapkan Style dengan Null, yang menyebabkan Button
kembali ke tampilan default. Anda juga dapat menetapkan Style ke Style lain secara
langsung.
Anda dapat menggunakan penurunan untuk menciptakan style yang sesuai dengan
“look and feel” dasar dari style original namun menyediakan perbedaan-perbedaan
yang mengganti beberapa kontrol dari yang kontrol yang lain. Sebagai contoh, Anda
mungkin menciptakan satu Style untuk semua elemen Button didalam UI Anda dan
menciptakan sebuah style yang diturunkan untuk menyediakan penekanan untuk salah
satu tombol. Anda dapat menggunakan properti BasedOn untuk menciptakan obyek-
obyek Style yang diturunkan dari obyek-obyek Style lainnya. Properti BasedOn mengacu
style lain dan secara otomatis menurunkan semua anggota dari Style tersebut dan
kemudian mengizinkan Anda untuk membangun Style tersebut dengan menambahkan
anggota-anggota tambahan.
Contoh berikut mendemonstrasikan dua obyek Style—sebuah Style asli dan sebuah Style
yang diturunkan:
<Window.Resources>
<Style x:Key="StyleOne">
<Setter Property="Button.Content" Value="Style set in original
Style" />
<Setter Property="Button.Background" Value="Red" />
<Setter Property="Button.FontSize" Value="15" />
<Setter Property="Button.FontFamily" Value="Arial" />
</Style>
Ketika sebuah properti ditetapkan dalam style original maupun style yang diturunkan,
nilai properti yang ditetapkan oleh style yang diturunkan selalu memiliki hak yang lebih
tinggi. Namun ketika sebuah properti ditetapkan oleh style original dan tidak ditetapkan
oleh style yang diturunkan, pengaturan properti original dipertahankan.
3.4 Kesimpulan
Pada bagian ini Kita telah membicarakan framework permodelan dan perancangan
antarmuka WPF. Perancangan dan permodelan WPF dapat dilakukan dengan mengatur
tata letak yang beragam, dukungan pengaksesan sumber daya antarmuka yang berbasis
XAML, dan juga dukungan langsung akses desain theme yang dimiliki oleh WPF.
Berbagai permodelan dasar antarmuka tersebut diharapkan dapat menjadi salah satu
kapabilitas bagi pengembang untuk membuat sebuah aplikasi yang menarik bagi
pengguna.
67 WPF, Just Code It!
Pada bab ini, Anda belajar menciptakan berbagai macam bentuk (shape) yang
sederhana maupun yang kompleks (geometri), melakukan transformasi atas bentuk-
bentuk tersebut, serta menggunakan berbagai macam kuas (brush) yang berbeda untuk
menciptakan efek-efek tertentu.
4.1 Shapes
Shape adalah sebuah tipe dari UIElement yang mengijinkan pembuatan gambar
berbagai bangun ke layar antarmuka. Karena shape adalah elemen-elemen antarmuka,
Obyek-obyek Shape dapat digunakan didalam elemen-elemen Panel dan sebagian besar
kontrol lainnya.
WPF menyediakan sejumlah obyek-obyek Shape yang siap digunakan. Semua obyek
shape diturunkan dari kelas Shape. Obyek-obyek shape yang tersedia mencakup Ellipse,
Line, Path, Polygon, Polyline dan Rectangle. Obyek-obyek Shape memiliki properti sbb:
Fill: Shape diregangkan dalam kedua dimensi untuk mengisi ruang yang tersedia,
namun aspek rasio dari shape tidak dipertahankan.
UniformToFill: Shape diperbesar untuk mengisi seluruh ruang gambar yang
tersedia dengan aspek rasio dipertahankan. Pemotongan shape mungkin
dilakukan agar pas dengan ruang.
Jika properti Height dan Width tidak ditetapkan secara eksplisit, Anda dapat
menggunakan properti Stretch untuk mendefinisikan bagaimana persegi tersebut
mengisi ruang yang tersedia.
<Ellipse
Fill="Yellow"
Height="100"
Width="200"
69 WPF, Just Code It!
StrokeThickness="2"
Stroke="Black"/>
C#
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
namespace SDKSample
{
public partial class SetBackgroundColorOfShapeExample : Page
{
public SetBackgroundColorOfShapeExample()
{
// Create a StackPanel to contain the shape.
StackPanel myStackPanel = new StackPanel();
4.1.2 Line
Kelas Line merepresentasikan sebuah garis yang menghubungkan dua titik koordinat.
Sistem koordinat yang digunakan untuk menggambar obyek-obyek Line berpusat pada
pojok kiri atas dari apapun yang memuat garis tersebut. Sebagai contoh, jika garis
berada didalam sebuah sel grid, maka titik (0,0) direpresentasikan oleh titik pojok kiri
atas dari sel grid. Anda dapat menciptakan sebuah obyek Line dengan menetapkan
properti X1, Y1, X2, dan Y2, seperti:
<Line.Stroke>
<RadialGradientBrush GradientOrigin="0.5,0.5" Center="0.5,0.5"
RadiusX="0.5" RadiusY="0.5">
<RadialGradientBrush.GradientStops>
<GradientStop Color="Red" Offset="0" />
<GradientStop Color="Blue" Offset="0.25" />
</RadialGradientBrush.GradientStops>
</RadialGradientBrush>
</Line.Stroke>
</Line>
C#
//
// Add a Line Element
//
myLine = new Line();
myLine.Stroke = System.Windows.Media.Brushes.LightSteelBlue;
myLine.X1 = 1;
myLine.X2 = 50;
myLine.Y1 = 1;
myLine.Y2 = 50;
myLine.HorizontalAlignment = HorizontalAlignment.Left;
myLine.VerticalAlignment = VerticalAlignment.Center;
myLine.StrokeThickness = 2;
myGrid.Children.Add(myLine);
72 WPF, Just Code It!
Walaupun kelas Line menyediakan properti Fill, menetapkan properti ini tidak berefek
karena sebuah Line tidak memiliki area yang bisa diisi.
4.1.3 Polyline
Kelas Polyline adalah sebuah shape yang lebih kompleks daripada Line. Pada dasarnya
Polyline adalah satu set titik-titik yang berkumpul. Kelas Polyline mengekspos sebuah
koleksi Points yang menggambarkan titik-titik didalam shape ini. Shape dimulai pada
titik pertama didalam koleksi, kemudian menghubungkan garis-garis lurus antara titik-
titik berikutnya didalam koleksi, dan selesai pada titik terakhir didalam koleksi. Contoh
berikut menggambarkan sebuah Polyline dengan shape gigi gergaji:
<Polyline Stroke="Blue" Points="300, 300 400, 400 400, 300 500, 400
500, 300"/>
4.1.4 Polygon
Kelas Polygon sangat mirip dengan kelas Polyline. Kelas ini juga mengekspos sebuah
koleksi Points yang menggambarkan titik-titik dari shape dan menghubungkan titik-titik
tersebut. Perbedaan utamanya adalah Polygon juga menghubungkan titik pertama
dengan titik terakhir dan melukis interior dari shape dengan Brush yang didefinisikan
didalam properti Fill.
Contoh berikut mendemonstrasikan sebuah Polygon yang mirip dengan contoh Polyline
sebelumnya:
73 WPF, Just Code It!
<Polygon Fill="Blue" Points="300, 300 400, 400 400, 300 500, 400 500,
300"/>
4.2 Transforms
Untuk menciptakan transformasi yang lebih kompleks, WPF menyediakan dua kelas
berikut:
75 WPF, Just Code It!
Kelas Deskripsi
TransformGroup Mengelompokkan beberapa obyek TransformGroup kedalam sebuah
Transform tunggal yang kemudian dapat Anda terapkan untuk
mentransformasi properti.
MatrixTransform Menciptakan transformasi-transformasi khusus yang tidak disediakan
oleh kelas-kelas Transform lainnya. Ketika Anda menggunakan
sebuah MatrixTransform, Anda memanipulasi Matrix secara
langsung.
Transformasi yang umum diterapkan ke sebuah shape adalah rotasi. Untuk merotasi
sebuah shape, ciptakan sebuah RotateTransform dan tentukan Angle (sudut)-nya.
Tetapkan properti CenterX dan CenterY jika Anda ingin mengontrol pada titik mana
elemen dirotasi. Nilai-nilai properti ini diekspresikan didalam ruang koordinat elemen
yang sedang ditransformasikan. CenterX dan CenterY memiliki nilai-nilai default nol. Lalu
terapkan RotateTransform ke elemen tersebut. Jika Anda tidak ingin transformasi
mempengaruhi layout, tetapkan properti RenderTransform.
XAML
<!—melakukan pemutaran bangun sebesar 45 (0,0). -->
<Polyline Points="25,25 0,50 25,75 50,50 25,25 25,0"
Stroke="Blue" StrokeThickness="10"
Canvas.Left="75" Canvas.Top="50">
<Polyline.RenderTransform>
<RotateTransform CenterX="0" CenterY="0" Angle="45" />
76 WPF, Just Code It!
</Polyline.RenderTransform>
</Polyline>
Didalam contoh berikut, shape lain dirotasi 45 derajat, namun kali ini ia dirotasi pada
titik (25,50).
XAML
<!—melakukan pemutaran bangun 45 derajat dari titik pusat -->
<Polyline
Points="25,25 0,50 25,75 50,50 25,25 25,0"
Stroke="Blue" StrokeThickness="10"
Canvas.Left="75" Canvas.Top="50"
RenderTransformOrigin="0.5,0.5">
<Polyline.RenderTransform>
<RotateTransform Angle="45" />
</Polyline.RenderTransform>
</Polyline>
WPF apapun. Catat bahwa sebuah Transform hanya mempengaruhi tampilan dari
sebuah kontrol. Fungsional dari sebuah kontrol tetap tidak terpengaruh, walaupun
menerapkan Transforms yang dramatis ke elemen-elemen UI dapat mempengaruhi
seberapa baik seorang pengguna dapat memahami dan menggunakan UI.
Anda dapat menerapkan sebuah Transform ke sebuah elemen dengan cara yang sama
jika Anda menerapkannya ke sebuah shape – dengan mengatur properti
RenderTransform. Contoh berikut mendemonstrasikan sebuah obyek Button dengan
SkewTransform diterapkan:
4.2.4 Flipping
Salah satu model dalam transformasi adalah membalik (flip) sebuah elemen, yang
menyeberangi sumbu y secara horizontal atau menyeberangi sumbu x secara vertikal.
Anda dapat membalik sebuah elemen dengan menggunakan ScaleTransform.
<ScaleTransform ScaleX="-1"></ScaleTransform>
</Button.RenderTransform>Flipped Button
</Button>
Untuk membalik sebuah elemen namun mempertahankan posisi aslinya, atur properti
RenderTransformOrigin dengan nilai .5, .5, seperti yang ditampilkan dalam cetak tebal
berikut:
4.3 Brush
Anda dapat mengubah tampilan sebuah kontrol dengan memberikan brush yang
berbeda ke salah satu propertinya. Berikut adalah beberapa properti dari Brush:
Brushes adalah obyek yang freezable. Karenanya Anda dapat membuat perubahan ke
obyek-obyek Brush selama metode Freeze belum dipanggil. Setelah metode
Brush.Freeze dipanggil, brush menjadi read-only dan tidak ada perubahan yang dapat
dilakukan.
4.3.1 SolidColorBrush
Brush aBrush;
aBrush = Brushes.AliceBlue;
<Button Background="Tomato"></Button>
Anda juga dapat menggunakan notasi heksadesimal untuk menetapkan brush didalam
XAML. Ketika menggunakan notasi heksadesimal, Anda menspesifikasikan sebuah
nomor heksadesimal delapan digit yang mendefinisikan warna. Pasangat pertama dari
digit (dari 00 hingga FF) menAndakan nilai opacity. Pasangan kedua dari digit
menunjukkan kekuatan dari Red channel. Set ketiga menunjukkan kekuatan dari Green
channel, dan pasangan terakhir menunjukkan kekuatan dari Blue channel. Nomor
heksadesimal diawali dengan sebuah #. Contoh berikut memperlihatkan pengaturan
background dari sebuah tombol menjadi obyek SolidColorBrush merah murni:
<Button Background="#FFFF0000"></Button>
81 WPF, Just Code It!
Anda juga dapat menciptakan sebuah obyek SolidColorBrush baru dengan mengatur
nilai dari masing-masing channel secara langsung, seperti:
<Button>
<Button.Background>
<SolidColorBrush>
<SolidColorBrush.Color>
<Color A="255" R="0" G="0" B="255"/>
</SolidColorBrush.Color>
</SolidColorBrush>
</Button.Background>
</Button>
SolidColorBrush aBrush;
aBrush = new SolidColorBrush(Color.FromArgb(255, 0, 255, 0));
C#
Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;
XAML
<Rectangle Width="75" Height="75">
<Rectangle.Fill>
<SolidColorBrush Color="Red" />
</Rectangle.Fill>
</Rectangle>
82 WPF, Just Code It!
Hasilnya adalah:
4.3.2 LinearGradientBrush
C#
Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;
exampleRectangle.Fill = myBrush;
XAML
<Rectangle Width="75" Height="75">
<Rectangle.Fill>
<LinearGradientBrush>
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Orange" Offset="0.5" />
<GradientStop Color="Red" Offset="1.0" />
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
Gradien dengan pencampuran warna-warna terjadi dalam sebuah garis yang berjalan
dari titik awal sampai titik akhir. Secara default, titik awal adalah (0,0), dan titik akhir
adalah (1,1), yang menciptakan sebuah gradient diagonal yang bercampur dari pojok kiri
atas ke pojok kanan bawah. Anda dapat menspesifikasikan titik-titik awal dan akhir
lainnya untuk LinearGradientBrush dengan menggunakan properti
LinearGradientBrush.StartPoint dan LinearGradientBrush.EndPoint. Garis yang
mendefinisikan gradien tidak perlu mulai dari pojok sistem koordinat. Sebagai contoh,
84 WPF, Just Code It!
Ketika garis yang menggambarkan gradien tidak meregang dari satu ujung sistem
koordinat ke ujung lainnya, nilai dari properti LinearGradientBrush.Spread menentukan
bagaimana sisa dari area tersebut dilukiskan. Nilai dan efek yang mungkin dari properti
ini:
Pad: Ini adalah nilai default untuk properti Spread. Ia menggunakan warna solid
pada salah satu sisi dari titik awal gradien.
Reflect: Ketika SpreadMethod diset dengan Reflect, gradien diperluas dalam
orientasi sebaliknya, seperti sebuah gambar cermin.
Repeat: Ketika SpreadMethod diset dengan Repeat, gradien diulangi dalam
orientasi yang sama.
4.3.3 RadialGradientBrush
C#
Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;
exampleRectangle.Fill = myBrush;
XAML
<Rectangle Width="75" Height="75">
<Rectangle.Fill>
<RadialGradientBrush GradientOrigin="0.75,0.25">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="Orange" Offset="0.5" />
<GradientStop Color="Red" Offset="1.0" />
</RadialGradientBrush>
</Rectangle.Fill>
</Rectangle>
4.3.4 ImageBrush
86 WPF, Just Code It!
C#
Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;
XAML
<Rectangle Width="75" Height="75">
<Rectangle.Fill>
<ImageBrush ImageSource="sampleImages\cherry.jpg" />
</Rectangle.Fill>
</Rectangle>
ImageBrush menggunakan gambar yang ditunjuk untuk melukis obyek-obyek visual yang
terkait dengannya. Jika gambar yang ditunjuk lebih kecil daripada obyek visual yang
diberikan ke brush, bagaimana brush melukis obyek dikontrol oleh nilai properti Stretch.
Nilai-nilai yang mungkin dari properti Stretch:
87 WPF, Just Code It!
Fill: Gambar diregangkan dalam kedua dimensi untuk mengisi ruang yang
tersedia. Aspek rasio gambar tidak dipertahankan.
None: Gambar dilukis pada ukuran aslinya. Area diluar ukuran gambar asli tidak
dilukis.
Uniform: Gambar diregangkan untuk mengisi dimensi dari ruang yang tersedia,
namun aspek rasio gambar dipertahankan. Area diluar ukuran yang diregangkan
tidak dilukis.
UniformToFill: Gambar diperluas untuk mengisi semua ruang lukis yang tersedia.
Aspek rasio dipertahankan, namun konten dapat dipotong jika aspek rasio
gambar berbeda dari aspek rasio kontainer.
4.3.5 VisualBrush
C#
Rectangle exampleRectangle = new Rectangle();
exampleRectangle.Width = 75;
exampleRectangle.Height = 75;
aPanel.Children.Add(someText);
myBrush.Visual = aPanel;
exampleRectangle.Fill = myBrush;
XAML
<Rectangle Width="75" Height="75">
<Rectangle.Fill>
<VisualBrush TileMode="Tile">
<VisualBrush.Visual>
<StackPanel>
<StackPanel.Background>
89 WPF, Just Code It!
<DrawingBrush>
<DrawingBrush.Drawing>
<GeometryDrawing>
<GeometryDrawing.Brush>
<RadialGradientBrush>
<GradientStop Color="MediumBlue" Offset="0.0" />
<GradientStop Color="White" Offset="1.0" />
</RadialGradientBrush>
</GeometryDrawing.Brush>
<GeometryDrawing.Geometry>
<GeometryGroup>
<RectangleGeometry Rect="0,0,50,50" />
<RectangleGeometry Rect="50,50,50,50" />
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</StackPanel.Background>
<TextBlock FontSize="10pt" Margin="10">Hello,
World!</TextBlock>
</StackPanel>
</VisualBrush.Visual>
</VisualBrush>
</Rectangle.Fill>
</Rectangle>
4.4 Drawing
Sebuah obyek Drawing menggambarkan konten yang terlihat, seperti sebuah shape,
bitmap, video, atau sebaris teks.
C#
// membuat geometri
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(new EllipseGeometry(new Point(50,50), 45, 20));
ellipses.Children.Add(new EllipseGeometry(new Point(50, 50), 20, 45));
// menggambar drawing
aGeometryDrawing.Pen = new Pen(Brushes.Black, 10);
91 WPF, Just Code It!
XAML
<GeometryDrawing>
<GeometryDrawing.Geometry>
Contoh berikut menggambarkan sebuah image kedalam sebuah rectangle yang terletak
pada (75,75) dari 100 x 100 pixel.
92 WPF, Just Code It!
C#
// menampilkan image (75,75).
ImageDrawing bigKiwi = new ImageDrawing();
bigKiwi.Rect = new Rect(75, 75, 100, 100);
bigKiwi.ImageSource = new BitmapImage(
new Uri(@"sampleImages\kiwi.png", UriKind.Relative));
XAML
<!-- The Rect property specifies that the image only fill a 100 by 100
rectangular area. -->
<ImageDrawing Rect="75,75,100,100"
ImageSource="sampleImages\kiwi.png"/>
C#
GlyphRun theGlyphRun = new GlyphRun(
new GlyphTypeface(new Uri(@"C:\WINDOWS\Fonts\TIMES.TTF")),
0,
false,
13.333333333333334,
new ushort[]{43, 72, 79, 79, 82, 3, 58, 82, 85, 79, 71},
93 WPF, Just Code It!
XAML
<GlyphRunDrawing ForegroundBrush="Black">
<GlyphRunDrawing.GlyphRun>
<GlyphRun
CaretStops="{x:Null}"
ClusterMap="{x:Null}"
IsSideways="False"
GlyphOffsets="{x:Null}"
GlyphIndices="43 72 79 79 82 3 58 82 85 79 71"
BaselineOrigin="0,12.29"
FontRenderingEmSize="13.333333333333334"
DeviceFontName="{x:Null}"
AdvanceWidths="9.62666666666667 7.41333333333333 2.96 2.96
7.41333333333333 3.70666666666667 12.5866666666667 7.41333333333333
4.44 2.96 7.41333333333333"
BidiLevel="0">
<GlyphRun.GlyphTypeface>
<GlyphTypeface FontUri="C:\WINDOWS\Fonts\TIMES.TTF" />
</GlyphRun.GlyphTypeface>
</GlyphRun>
94 WPF, Just Code It!
</GlyphRunDrawing.GlyphRun>
</GlyphRunDrawing>
C#
// Create three drawings.
GeometryDrawing ellipseDrawing =
new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(102, 181, 243, 20)),
new Pen(Brushes.Black, 4),
new EllipseGeometry(new Point(50,50), 50, 50)
);
ImageDrawing kiwiPictureDrawing =
new ImageDrawing(
new BitmapImage(new Uri(@"sampleImages\kiwi.png",
95 WPF, Just Code It!
UriKind.Relative)),
new Rect(50,50,100,100));
GeometryDrawing ellipseDrawing2 =
new GeometryDrawing(
new SolidColorBrush(Color.FromArgb(102,181,243,20)),
new Pen(Brushes.Black, 4),
new EllipseGeometry(new Point(150, 150), 50, 50)
);
XAML
<DrawingGroup>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="50,50" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
<ImageDrawing ImageSource="sampleImages\kiwi.png"
Rect="50,50,100,100"/>
<GeometryDrawing Brush="#66B5F314">
<GeometryDrawing.Geometry>
<EllipseGeometry Center="150,150" RadiusX="50" RadiusY="50"/>
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Brush="Black" Thickness="4" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingGroup>
96 WPF, Just Code It!
C#
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SDKSample
{
public class DrawingImageExample : Page
{
public DrawingImageExample()
{
// Create the Geometry to draw.
GeometryGroup ellipses = new GeometryGroup();
ellipses.Children.Add(
new EllipseGeometry(new Point(50,50), 45, 20)
);
ellipses.Children.Add(
97 WPF, Just Code It!
// Create a GeometryDrawing.
GeometryDrawing aGeometryDrawing = new GeometryDrawing();
aGeometryDrawing.Geometry = ellipses;
exampleBorder.VerticalAlignment = VerticalAlignment.Top;
exampleBorder.Margin = new Thickness(10);
XAML
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml
/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-
compatibility/2006"
mc:Ignorable="PresentationOptions"
Background="White" Margin="20">
<!-- This image uses a Drawing object for its source. -->
<Image>
<Image.Source>
<DrawingImage PresentationOptions:Freeze="True">
<DrawingImage.Drawing>
<GeometryDrawing>
<GeometryDrawing.Geometry>
<GeometryGroup>
<EllipseGeometry Center="50,50" RadiusX="45"
RadiusY="20" />
<EllipseGeometry Center="50,50" RadiusX="20"
99 WPF, Just Code It!
RadiusY="45" />
</GeometryGroup>
</GeometryDrawing.Geometry>
<GeometryDrawing.Brush>
<LinearGradientBrush>
<GradientStop Offset="0.0" Color="Blue" />
<GradientStop Offset="1.0" Color="#CCCCFF" />
</LinearGradientBrush>
</GeometryDrawing.Brush>
<GeometryDrawing.Pen>
<Pen Thickness="10" Brush="Black" />
</GeometryDrawing.Pen>
</GeometryDrawing>
</DrawingImage.Drawing>
</DrawingImage>
</Image.Source>
</Image>
</Border>
</Page>
4.6 Geometry
Karena sebuah Geometry adalah sebuah tipe dari Freezable, obyek-obyek Geometry
menyediakan beberapa fitur khusus: mereka dapat dideklarasikan sebagai resources,
100 WPF, Just Code It!
yang dibagi antara banyak obyek, dibuat read-only untuk meningkatkan performa,
diklon dan dibuat thread-safe.
Kelas Geometry dan Shape terlihat mirip karena mereka berdua mendeskripsikan shape-
shape 2-D, namun ada beberapa perbedaan penting.
4.6.2 Path
Path adalah shape yang paling kompleks didalam WPF. Sebuah obyek Path menguraikan
sebuah shape yang kompleks yang dapat dibangun dari satu atau lebih obyek Geometry.
Sebuah obyek Geometry dapat dianggap sebagai sebuah blueprint untuk sebuah Shape.
Ia memuat semua data mengenai tampilan dari sebuah shape, seperti koordinat dan
ukuran, namun ia tidak menyertakan event-handling atau fungsionalitas berbasis
kontrol dari sebuah Shape.
Jenis obyek-obyek Geometry yang dapat digunakan untuk menciptakan sebuah Path:
101 WPF, Just Code It!
Cara paling sederhana untuk menciptakan sebuah Path adalah menambahkan sebuah
obyek Geometry tunggal ke properti Path.Data, seperti:
<Path Fill="Aqua">
<Path.Data>
<EllipseGeometry RadiusX="40" RadiusY="50"/>
</Path.Data>
</Path>
Anda dapat menciptakan paths yang terdiri dari bayak shape dengan menggunakan
kelas GeometryGroup. Contoh berikut menambahkan sebuah persegi dan sebuah elips:
Shape yang amat sangat kompleks dapat diciptakan menggunakan kelas PathGeometry.
4.6.3 Clipping
Anda juga dapat menggunakan obyek-obyek Geometry untuk memotong shape dari
elemen-elemen dengan mengatur properti Clip, yang diekspos oleh semua elemen WPF.
Mengatur properti Clip membatasi tampilan visual dari kontrol yang dipengaruhi ke
shape yang dijelaskan oleh obyek Geometry yang properti Clip nya diset. Ini tidak
mentransformasi elemen dengan cara apapun; ia memotong batasan-batasan yang
terlihat dari kontrol agar cocok dengan obyek Geometry.
Gambar 4.14 memperlihatkan dua elemen Button yang berukuran sama. Button kiri
properti Clip nya tidak diset, sedangkan Button kanan properti Clip nya diset ke obyek
EllipseGeometry.
4.7 Kesimpulan
Pada bagian ini dikemukakan berbagai obyek-obyek visual yang dimiliki oleh pustaka
WPF. Obye-obyek ini tentu siap pakai dalam membantu pengembang untuk
memvisualisasikan aplikasi yang lebih hidup dan lebih estetik. Selain berupa bentuk-
104 WPF, Just Code It!
bentuk bangun, WPF juga mendukung berbagai macam manipulasi trensformasi bangun
yang umum ada di dunia animasi seperti pergeseran, rotasi, pencerminan, hingga
pergerakan dinamis.
105 WPF, Just Code It!
5 Kontrol-kontrol WPF
WPF dikemas dengan banyak komponen umum UI yang digunakan hampir dalam semua
aplikasi Windows, seperti Button, Label, TextBox, Menu, dan ListBox. Bab ini akan
membahas beberapa kontrol yang paling sering digunakan dalam aplikasi WPF yaitu
Label, Button, CheckBox, RadioButton, TextBlock, Image, TextBox, ComboBox, ListBox,
TreeView, Menu dan Toolbar.
Kontrol Label adalah salah satu kontrol WPF yang paling sederhana dan paling banyak
digunakan. Kontrol ini biasanya menyediakan informasi didalam UI. Menurut sejarah,
sebuah Label hanya memuat teks saja, namun karena Label yang dikemas dengan WPF
adalah sebuah ContentControl, ia dapat memuat teks, bisa juga memuat UIElement.
Label memiliki dukungan built-in untuk kunci-kunci mnemonik. Ini adalah kunci-kunci
yang memindahkan fokus ke sebuah kontrol yang ditunjuk ketika kunci ALT ditekan
dengan kunci mnemonik. Sebagai contoh, jika R adalah kunci mnemonik untuk sebuah
kontrol, fokus akan berpindah ke kontrol tersebut ketika ditekan ALT+R.
Label dan kunci mnemonik sering digunakan untuk memungkinkan akses cepat
keyboard ke kontrol-kontrol seperti sebuah TextBox. Gambar berikut menampilkan
sebuah Label "Themes" yang bertarget sebuah ComboBox. Ketika pengguna menekan
ALT+T, ComboBox menerima fokus.
106 WPF, Just Code It!
Kunci mnemonik ditetapkan dengan memberi awalan simbol underscore (_) pada kunci
yang diinginkan, dan tampil bergaris bawah pada run time ketika kunci ALT ditekan.
Sebagai contoh, kode berikut tampil sebagai Press Alt+A pada run time ketika kunci
ALT telah ditekan:
<Label>Press Alt+_A</Label>
Kontrol Button bereaksi atas masukan pengguna dari sebuah mouse, keyboard, stylus,
atau perangkat masukan lainnya. Button dirancang untuk mengizinkan pengguna
membuat sebuah pilihan, menutup sebuah kotak dialog, atau melakukan aksi lainnya.
Anda dapat mengeksekusi kode ketika button diklik dengan menangani event Click.
Button adalah sebuah komponen UI dasar yang dapat memuat konten
sederhana, seperti teks, dan juga dapat memuat konten yang kompleks, seperti kontrol-
kontrol Panel dan Images.
Gambar 5.2 Button dalam keadaan default, mendapatkan fokus, dan ditekan
Kontrol Button mengekspos dua properti penting yang membuatnya berguna ketika
membangun UI, yaitu properti IsDefault dan IsCancel.
Kontrol Checkbox sebenarnya diturunkan dari kelas ButtonBase dan biasanya digunakan
untuk mengizinkan pengguna untuk memilih apakah sebuah opsi dipilih atau tidak. Anda
dapat menentukan apakah sebuah checkbox dipilih atau tidak dengan mengakses
properti IsChecked.
Sebuah fitur fundamental dari kontrol RadioButton adalah bahwa mereka dapat
dikelompokkan. Didalam sekelompok kontrol RadioButton, memilih salah satunya
secara otomatis membersihkan yang lainnya. Karenanya, tidak mungkin lebih dari satu
radio button didalam sebuah grup dipilih pada satu waktu.
109 WPF, Just Code It!
Biasanya, semua kontrol RadioButton didalam sebuah kontainer tunggal secara otomatis
didalam grup yang sama. Jika Anda ingin memiliki sebuah grup tinggal dari tiga kontrol
RadioButton didalam sebuah jendela, yang perlu Anda lakukan adalah menambahkan
ketiganya ke jendela Anda – mereka secara otomatis dikelompokkan. Anda dapat
memiliki banyak grup didalam sebuah kontainer tunggal dengan menetapkan properti
GroupName.
Contoh berikut mendemonstrasikan dua grup yang masing-masing terdiri dari dua radio
button:
Anda juga dapat menciptakan grup-grup radio button dengan membungkusnya didalam
kontainer, seperti didalam kode berikut:
TextBlock adalah salah satu elemen WPF yang paling sederhana. Ia hanya
merepresentasikan sebuah area teks yang muncul didalam sebuah jendela. Contoh
berikut mendemonstrasikan sebuah kontrol TextBlock:
Jika Anda ingin mengubah teks didalam TextBlock didalam kode, Anda harus
menetapkan properti Name dari TextBlock sehingga Anda dapat mengacunya didalam
kode, seperti:
Kemudian Anda dapat mengubah teks atau properti lainnya dengan mengacunya
didalam kode, seperti:
// C#
TextBlock1.Text = "Here is the changed text";
membutuhkan lebih dari satu paragraf teks. Kontrol ini mendukung sejumlah properti
yang memungkinkan kontrol yang tepat atas presentasi, seperti FontFamily, FontSize,
FontWeight, TextEffect dan TextWrapping. Konten teks dapat ditambahkan
menggunakan properti Text. Ketika digunakan didalam XAML, konten antara tag
pembuka dan tag penutup secara implisit ditambahkan sebagai teks elemen.
XAML
<TextBlock FontSize="18" FontWeight="Bold" FontStyle="Italic">
Hello, world!
</TextBlock>
<TextBlock Name="textBlock2"
TextWrapping="Wrap" Background="AntiqueWhite" TextAlignment="Center"
112 WPF, Just Code It!
>
By default, a TextBlock provides no UI beyond simply displaying its
contents.
</TextBlock>
Hasilnya adalah:
Contoh berikut memperlihatkan bagaimana cara mendapatkan hasil seperti gambar 5.5
secara programatik.
C#
TextBlock textBlock1 = new TextBlock();
TextBlock textBlock2 = new TextBlock();
Properti utama dari kontrol Image adalah properti Source. Properti ini mengambil
sebuah kelas System.Windows.Media.ImageSource didalam kode, namun ketika
ditetapkan didalam XAML ia dapat ditetapkan sebagai Uniform Resource Identifier (URI)
dimana image dimuat. Sebagai contoh, lihat kode berikut:
<Image Source="C:\Pictures\Cherry.jpg"/>
URI bisa berupa local disk resource atau Web resource. Properti Image.Stretch
menentukan bagaimana sebuah image ditampilkan, apakah ditampilkan pada ukuran
sebenarnya dan dipotong (jika perlu) agar sesuai dengan batas image, atau apakah
ditampilkan dengan diperkecil atau diperbesar agar sesuai dengan batas kontrol Image.
Nilai-nilai yang mungkin untuk properti Stretch:
None: Konten image dipresentasikan pada ukuran aslinya. Jika perlu, ia dipotong
agar sesuai dengan ruang yang tersedia.
Fill: Konten image disesuaikan ukurannya (diperbesar atau diperkecil sesuai
kebutuhan) agar sesuai dengan ukuran kontrol Image.
Uniform: Konten image disesuaikan ukurannya agar sesuai dengan dimensi
tujuan sembari mempertahankan aspek rasio aslinya. Tidak akan terjadi
pemotongan, sehingga mungkin terdapat ruang kosong pada tepi kontrol Image.
UniformToFill: Konten image disesuaikan ukurannya agar sesuai dengan dimensi
tujuan sembari mempertahankan aspek rasio aslinya. Jika aspek rasio dari
114 WPF, Just Code It!
kontrol Image berbeda dari konten image, konten tersebut dipotong agar sesuai
dengan kontrol Image.
Ketika menampilkan sebuah image yang multiframe, hanya frame pertama yang
ditampilkan. Animasi atas image multiframe tidak didukung oleh kontrol Image.
Hingga konten image dimuat, ActualWidth dan ActualHeight dari kontrol akan
dilaporkan sebagai nol, karena konten image digunakan untuk menentukan lokasi dan
ukuran final kontrol.
Kelas TextBox memungkinkan Anda untuk menampilkan atau mengubah teks tak
berformat. Kegunaan umum dari TextBox adalah mengubah teks tak berformat didalam
sebuah form. Sebagai contoh, form yang meminta nama, nomor telepon, dll akan
menggunakan kontrol TextBox untuk masukan teks.
Kontrol Textbox mengizinkan pengguna untuk menuliskan teks kedalam UI. Teks
tersebut dapat diakses kemudian oleh aplikasi didalam properti TextBox.Text. Anda
dapat menggunakan sebuah TextBox semata-mata untuk tampilan teks dengan
mengatur properti IsReadOnly menjadi True, seperti:
Walaupun kontrol TextBox dapat diciptakan sebagai sebuah rectangle, secara default ia
berbaris tunggal. Untuk memungkinkan pembungkusan teks didalam sebuah TextBox,
tetapkan properti TextWrapping menjadiWrap, seperti:
Kontrol TextBox mencakup dukungan otomatis untuk scroll bars. Anda dapat
mengaktifkan vertical scroll bars dengan menetapkan properti VerticalScrollBarVisibility
menjadi Auto atau Visible, seperti:
ComboBox mengizinkan pengguna untuk memilih sebuah item dari drop-down list atau
secara opsional memasukkan teks baru didalam text box kontrol.
Memasukkan sebuah string string yang tidak terkait dengan sebuah item didalam
ComboBox.
Kontrol ComboBox sangat mirip dengan kontrol ListBox. Ia dapat memuat sebuah daftar
item, yang masing-masing dapat berupa sebuah obyek dengan tipe apapun, seperti
didalam kontrol ListBox. Sehingga, kontrol ComboBox dapat menampung sebuah daftar
117 WPF, Just Code It!
string, sebuah daftar kontrol seperti CheckBoxes, atau daftar jenis apapun. Perbedaan
antara kontrol ComboBox dan kontrol ListBox adalah bagaimana kontrol
dipresentasikan. Kontrol ComboBox tampil sebagai sebuah drop-down list. Seperti
kontrol ListBox, Anda bisa mendapatkan acuan ke item yang dipilih melalui properti
SelectedItem dan Anda dapat mengambil indeks dari item yang dipilih melalui properti
SelectedIndex.
Ketika sebuah item dipilih, representasi string dari konten item tersebut ditampilkan
didalam kontrol ComboBox. Sehingga, jika kontrol ComboBox menampung sebuah
daftar string, maka string yang dipilih akan ditampilkan. Jika kontrol ComboBox
menampung sebuah daftar kontrol CheckBox, representasi string dari properti
ComboBox.Content akan ditampilkan. Kemudian nilai yang dipilih akan tersedia melalui
properti ComboBox.Text.
Pengguna juga dapat mengedit teks yang ditampilkan didalam kontrol ComboBox.
Mereka bahkan dapat mengetikkan teks mereka sendiri, seperti didalam sebuah
textbox. Untuk membuat kontrol ComboBox dapat diedit, Anda harus menetapkan
properti IsReadOnly menjadi False dan menetapkan properti IsEditable menjadi True.
Anda dapat membuka dan menutup kontrol ComboBox secara programatik dengan
menetapkan properti IsDrop-DownOpen menjadi True (untuk membukanya) dan False
(untuk menutupnya).
Sebuah kontrol ListBox menyediakan sebuah daftar item yang dapat dipilih oleh
pengguna.
118 WPF, Just Code It!
Sebuah kontrol ListBox biasanya menampilkan sebuah daftar kontrol ListBoxItem. Cara
paling sederhana untuk mengisi kontrol ListBox adalah dengan menambahkan item-item
secara langsung didalam XAML, seperti:
ListBox adalah sebuah kontrol yang memuat sekumpulan item. Lebih dari satu item
didalam sebuah ListBox yang dapat dilihat, tidak seperti ComboBox, yang mana hanya
item yang dipilih yang dapat dilihat kecuali properti IsDropDownOpen bernilai true.
Secara default, kontrol ListBox mengizinkan Anda untuk memilih sebuah item tunggal.
Anda dapat mengambil indeks dari item yang dipilih dari properti ListBox.SelectedIndex
atau Anda dapat mengambil item yang dipilih tersebut melalui properti
ListBox.SelectedItem. Kontrol ListBoxItem juga mengekspos sebuah properti IsSelected
yang positif ketika item dipilih. Properti SelectionMode menentukan apakah lebih dari
satu item didalam ListBox dapat dipilih pada satu waktu. Nilai yang mungkin untuk
properti ini adalah:
Single: Pengguna dapat memilih hanya satu item pada satu waktu.
Multiple: Pengguna dapat memilih banyak item tanpa menahan kunci modifier.
119 WPF, Just Code It!
<ListBox SelectionMode="Extended">
</ListBox>
Ketika dipilih banyak item, Anda bisa mendapatkan item-item yang dipilih tersebut
melalui properti ListBox.SelectedItems.
Kontrol TreeView memuat sebuah hirarki dari kontrol TreeViewItem. Kontrol TreeView
adalah sebuah HeaderedItemsControl yang memiliki sebuah Header dan sebuah koleksi
120 WPF, Just Code It!
Items. Jika Anda menggambarkan sebuah TreeView menggunakan XAML, Anda dapat
secara eksplisit menggambarkan konten Header dari kontrol TreeViewItem dan item-
item yang menyusun koleksinya.
Properti SelectedItem pada kontrol TreeView adalah properti yang read-only, sehingga
Anda tidak dapat menetapkannya secara eksplisit. Properti SelectedItem ditetapkan jika
pengguna klik pada sebuah kontrol TreeViewItem atau ketika properti IsSelected
ditetapkan menjadi true pada kontrol TreeViewItem.
5.11 Menu
Keyboard shortcuts adalah kombinasi karakter yang dapat dimasukkan dengan keyboard
untuk membangkitkan perintah-perintah Menu. Sebagai contoh, shortcut untuk Copy
adalah CTRL+C. Adal dua properti yang digunakan dengan keyboard shortcuts dan item-
item menu, yaitu InputGestureText dan Command.
Berikut adalah beberapa properti penting yang dimiliki oleh kontrol MenuItem:
<MenuItem Header="Close"/>
<MenuItem Header="Save" Command="ApplicationCommands.Save"/>
</MenuItem>
</Menu>
Kontrol ContextMenu tidak memiliki lokasi tetap didalam UI, melainkan dikaitkan
dengan kontrol lain. Untuk menciptakan sebuah ContextMenu untuk sebuah kontrol,
Anda menggambarkannya didalam kode XAML untuk properti Control.ContextMenu,
seperti diperlihatkan didalam contoh berikut dengan sebuah kontrol ListBox:
Sekali sebuah kontrol ContextMenu telah ditetapkan untuk sebuah kontrol, ia akan
ditampilkan kapanpun pengguna klik kanan kontrol tersebut atau menekan Shift+F10
ketika kontrol mendapatkan fokus. Skenario umum lainnya untuk menambahkan
ContextMenus ke sebuah kontrol adalah menambahkannya ke sebuah resource didalam
Window.Resources collection.
124 WPF, Just Code It!
5.12 Toolbar
Kontrol ToolBar adalah kontainer untuk sekelompok perintah atau kontrol yang
biasanya terkait dalam fungsi mereka. Sebuah ToolBar biasanya memuat tombol-tombol
yang membangkitkan perintah-perintah. Kontrol ToolBar cocok untuk menampung
kontrol-kontrol seperti Button, ComboBox, TextBox, Check-Box dan RadioButton.
Anda menambahkan item-item ke kontrol ToolBar dengan cara yang sama dengan
kontrol item lainnya. Contoh:
Ketika lebih banyak kontrol ditambahkan ke sebuah ToolBar daripada jumlah yang dapat
ditampungnya, kontrol-kontrol tersebut akan disingkirkan hingga bersesuaian dengan
ruang yang ada. Kontrol-kontrol yang disingkirkan dari ToolBar secara otomatis
diletakkan didalam menu Overflow.
Menu Overflow muncul sebagai sebuah drop-down list pada sisi kanan toolbar ketika
toolbar ada didalam konfigurasi horizontal. Anda dapat mengelola bagaimana kontrol-
kontrol tersebut diletakkan didalam menu Overflow dengan menetapkan properti
ToolBar.OverflowMode. Nilai-nilai yang mungkin untuk properti ini:
125 WPF, Just Code It!
5.13 Kesimpulan
Pada bagian ini dikemukakan berbagai kontrol antarmuka yang dapat digunakan sebagai
sarana komunikasi antarmuka pengembang dan pengguna. Berbagai kontrol yang
mungkin sudah menjadi tampilan kontrol mendasar dikaitkan dengan xaml agar dapat
dideklarasikan secara deklaratif. Hal yang menarik lainnya semua kontrol antarmuka
yang dikemukakan adalah antarmuka berbasis obyek dasar WPF atau dengan kata lain
dapat ditransformasikan dan dimanipulasi seperti halnya shape.
126 WPF, Just Code It!
WPF data binding menyediakan sebuah cara yang sederhana dan konsisten bagi aplikasi
untuk menyajikan dan berinteraksi dengan data. Elemen dapat diikatkan ke data dari
berbagai sumber data dalam bentuk obyek CLR (common language runtime) dan XML.
Data Binding (pengikatan data) adalah proses yang membangun sebuah koneksi antara
UI aplikasi dan logika bisnis. Jika binding memiliki pengaturan yang benar dan data
memberikan notifikasi yang sesuai, maka ketika data mengubah nilainya, elemen-
elemen yang diikatkan ke data tersebut secara otomatis merefleksikan perubahan-
perubahan yang terjadi. Binding juga dapat berarti bahwa jika sebuah representasi luar
data didalam sebuah elemen berubah, maka data dasar dapat secara otomatis diupdate
untuk merefleksikan perubahan tersebut. Sebagai contoh, jika pengguna mengedit nilai
didalam sebuah elemen TextBox, nilai data dasar secara otomatis diupdate untuk
merefleksikan perubahan tersebut.
Kegunaan khusus dari data binding adalah untuk menempatkan data konfigurasi lokal
atau server kedalam form atau kontrol UI lainnya. Pada teknologi WPF, konsep ini
diperluas untuk mencakup pengikatan berbagai properti ke berbagai sumber data.
Didalam WPF, properti dependency elemen dapat diikatkan ke obyek-obyek CLR
(termasuk obyek-obyek ADO.NET atau obyek-obyek yang terkait dengan Web Services
dan Web properties) dan data XML.
Tanpa mempedulikan eleman apa yang Anda ikat dan sifat dari sumber data Anda,
setiap pengikatan data selalu mengikuti model yang diilustrasikan oleh gambar berikut:
127 WPF, Just Code It!
Seperti yang diilustrasikan oleh gambar 6.1, data binding pada dasarnya adalah
jembatan antara binding target (target pengikatan) dan binding source (sumber
pengikatan). Gambar tersebut mendemonstrasikan konsep dasar pengikatan data WPF:
Properti target haruslah sebuah properti khusus yang dikenal dengan property
dependency. Sebagian besar properti UIElement adalah properti dependency
dan sebagian besar properti dependency, kecuali yang read-only, secara default
mendukung pengikatan data.
Obyek binding source tidak harus menjadi obyek CLR khusus. WPF data binding
mendukung data dalam bentuk obyek CLR dan XML.
Ketika Anda melakukan pengikatan data, Anda mengikatkan binding target ke binding
source. Sebagai contoh, jika Anda menampilkan beberapa data XML dasar didalam
sebuah ListBox menggunakan data binding, Anda mengikatkan ListBox Anda ke data
XML.
Pola penciptaan sebuah pengikatan data, dapat menggunakan obyek Binding. Pada
contoh berikut, obyek binding source adalah sebuah kelas yang bernama MyData dan
didefinisikan didalam namespace SDKSample. Kelas MyData memiliki sebuah properti
string yang bernama ColorName, yang nilainya diset menjadi "Red". Contoh ini
menghasilkan sebuah tombol dengan background berwarna merah.
C#
<DockPanel
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:c="clr-namespace:SDKSample">
<DockPanel.Resources>
<c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<DockPanel.DataContext>
<Binding Source="{StaticResource myDataSource}"/>
</DockPanel.DataContext>
<Button Background="{Binding Path=ColorName}"
Width="150" Height="30">Saya di ikat berwarna merah!</Button>
</DockPanel>
Gambar 6.2 menggambarkan diagram dasar dari contoh diatas. Ini adalah sebuah
OneWay binding karena properti Background mendukung OneWay binding secara
default.
Ada beberapa cara untuk menentukan obyek binding source. Menggunakan properti
DataContext pada sebuah elemen induk sangat berguna ketika Anda mengikatkan
banyak properti ke sumber yang sama. Meskipun demikian, kadangkala lebih sesuai
untuk menentukan binding source pada deklarasi pengikatan individual. Dari contoh
sebelumnya, dengan tidak menggunakan DataContext, Anda dapat menetapkan
properti Source secara langsung pada deklarasi binding dari tombol, seperti berikut:
C#
<DockPanel.Resources>
<c:MyData x:Key="myDataSource"/>
</DockPanel.Resources>
<Button Width="150" Height="30"
Background="{Binding Source={StaticResource myDataSource},
Path=ColorName}">Saya diikat berwarna merah!
</Button>
Jika binding source Anda adalah sebuah obyek, gunakan properti Path untuk
menetapkan nilai yang akan digunakan untuk pengikatan data Anda. Jika Anda
130 WPF, Just Code It!
mengikatkan ke data XML, gunakan properti XPath untuk menetapkan nilainya. Dalam
beberapa kasus, dapat digunakan properti Path bahkan ketika data Anda adalah XML.
Sebagai contoh, jika Anda ingin mengakses properti Name dari sebuah XmlNode balikan
(sebagai hasil dari queri XPath), Anda harus menggunakan properti Path sebagai
tambahan untuk properti XPath.
Walaupun kita telah menekankan bahwa Path ke nilai yang digunakan adalah salah satu
dari empat komponen penting dari sebuah binding, dalam skenario dimana Anda ingin
mengikatkan ke seluruh obyek, nilai yang digunakan akan sama dengan obyek binding
source. Pada kasus demikian, Anda bisa tidak menetapkan sebuah Path. Perhatikan
contoh berikut:
C#
<ListBox ItemsSource="{Binding}"
IsSynchronizedWithCurrentItem="true"/>
Contoh diatas menggunakan sintaks pengikatan kosong: {Binding}. Dalam kasus ini,
ListBox mewarisi DataContext dari elemen DockPanel induk. Ketika path tidak
ditentukan, defaultnya adalah mengikatkan ke seluruh obyek. Dengan kata lain, path
telah dihilangkan karena kita mengikatkan properti ItemSource ke seluruh obyek.
Kelas Binding adalah kelas level tertinggi untuk deklarasi pengikatan data. kelas Binding
menyediakan banyak properti yang mengizinkan Anda untuk menetapkan karakteristik
dari sebuah binding. Kelas yang terkait yaitu BindingExpression, adalah obyek dasar
yang memelihara koneksi antara sumber dan target. Sebuah binding memuat semua
informasi yang dapat digunakan bersama dalam beberapa ekspresi binding expressions.
BindingExpression adalah sebuah instan ekspresi yang tidak dapat digunakan bersama
dan memuat semua instan informasi dari Binding.
131 WPF, Just Code It!
Pada contoh berikut, myDataObject adalah sebuah instan kelas MyData, myBinding
adalah onbyek Binding sumber, dan kelas MyData adalah sebuah kelas yang
didefinisikan yang memuat sebuah properti string yang bernama MyDataProperty.
Contoh berikut mengikatkan konten teks mytext, sebuah instan TextBlock, ke
MyDataProperty.
C#
//make a new source
MyData myDataObject = new MyData(DateTime.Now);
Binding myBinding = new Binding("MyDataProperty");
myBinding.Source = myDataObject;
myText.SetBinding(TextBlock.TextProperty, myBinding);
Anda dapat menggunakan obyek myBinding yang sama untuk menciptakan binding-
binding lainya. Sebagai contoh, Anda dapat menggunakan obyek myBinding untuk
mengikatkan konten teks dari sebuah check box ke MyDataProperty. Pada skenario
tersebut, akan ada dua instan BindingExpression yang berbagi pakai obyek myBinding.
Sebuah obyek binding source dapat diperlakukan sebagai sebuah obyek tunggal dimana
properti-propertinya memuat data atau sebagai sebuah koleksi data dari obyek-obyek
polimorfik yang sering dikelompokkan bersama (seperti hasil dari sebuah query basis
data). Melakukan binding ke sebuah koleksi data adalah sebuah skenario yang umum.
Sebagai contoh, skenario umumnya adalah menggunakan sebuah ItemsControl seperti
sebuah ListBox, ListView, atau TreeView untuk menampilkan sebuah koleksi data.
Data template adalah sekumpulan kode XAML yang menjelaskan bagaimana data yang
diikatkan ditampilkan. Sebuah data template dapat memuat elemen-elemen yang
masing-masing diikatkan ke sebuah properti data, bersama dengan markup tambahan
yang mendeskripsikan layout, warna, dan aspek-aspek lain dari tampilannya. Contoh
berikut mendemonstrasikan sebuah data template sederhana yang menggambarkan
sebuah elemen Label yang diikatkan ke properti ContactName. Properti Foreground,
Background, BorderBrush, dan BorderThickness juga ditetapkan:
<DataTemplate>
<Label Content="{Binding Path=ContactName}" BorderBrush="Black"
Background="Yellow" BorderThickness="3" Foreground="Blue" />
</DataTemplate>
Katika mengikatkan sebuah properti atau list secara langsung ke sebuah kontrol, Anda
dibatasi untuk mengikatkan sebuah properti tunggal. Meskipun demikian, dengan data
template Anda dapat mengikatkan lebih dari satu properti didalam masing-masing item,
dengan demikian menampilkan banyak bit dari data yang terkait bersama-sama.
133 WPF, Just Code It!
Anda dapat menerapkan data templates ke kontrol konten juga. Walaupun sebuah
kontrol konten dapat menampilkan hanya sebuah rekaman tunggal pada satu waktu, ia
dapat menggunakan semua fitur format dari teknologi data template.
Anda menetapkan data template pada sebuah kontrol dengan mengatur satu dari dua
properti. Untuk kontrol konten, Anda menetapkan properti ContentTemplate, seperti
yang bercetak tebal berikut:
Untuk kontrol item, Anda menetapkan properti ItemsTemplate, seperti yang bercetak
tebal berikut:
Untuk kontrol item, properti DisplayMemberPath dan ItemTemplate eksklusif satu sama
lain—Anda dapat menetapkan salah satu saja.
134 WPF, Just Code It!
Sebuah pola yang sering muncul dengan data templates adalah mendefinisikannya
didalam sebuah koleksi sumber daya dan mereferensinya didalam elemen Anda. Yang
dibutuhkan untuk menggunakan kembali sebuah data template dalam cara ini adalah
mendefinisikan template tersebut didalam sebuah koleksi sumber daya dan
menetapkan sebuah Key untuk template tersebut, seperti:
<Window.Resources>
<DataTemplate x:Key="myTemplate">
<Label Content="{Binding Path=ContactName}" BorderBrush="Black"
Background="Yellow" BorderThickness="3" Foreground="Blue" />
</DataTemplate>
</Window.Resources>
Sebagian besar aplikasi yang mengambil masukan pengguna perlu memiliki logika
validasi untuk memastikan bahwa pengguna telah memasukkan informasi yang
diharapkan. Pemeriksaan validasi dapat berdasarkan pada tipe, jangkauan, format, atau
lainnya.
C#
135 WPF, Just Code It!
C#
class FutureDateRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo
cultureInfo)
{
DateTime date;
try
{
date = DateTime.Parse(value.ToString());
}
catch (FormatException)
{
return new ValidationResult(false, "Value is not a valid
136 WPF, Just Code It!
date.");
}
if (DateTime.Now.Date > date)
{
return new ValidationResult(false, "Please enter a date in
the future.");
}
else
{
return ValidationResult.ValidResult;
}
}
}
Jika pengguna memasukkan sebuah nilai yang invalid, Anda mungkin ingin memberikan
beberapa umpan balik tentang error pada UI aplikasi. Salah satu cara untuk
menyediakan umpan balik adalah menetapkan properti ErrorTemplate ke sebuah
ControlTemplate khusus. Seperti yang diperlihatkan pada contoh sebelumnya, TextBox
137 WPF, Just Code It!
C#
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
C#
<Style x:Key="textStyleTextBox" TargetType="TextBox">
<Setter Property="Foreground" Value="#333333" />
<Setter Property="MaxLength" Value="40" />
<Setter Property="Width" Value="392" />
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
138 WPF, Just Code It!
Gambar 6.4 Tampilan ErrorTemplate khusus dan ToolTip untuk sebuah error validasi
Jika Binding Anda memiliki aturan-aturan validasi namun Anda tidak menetapkan
ErrorTemplate pada kontrol pengikatan, ErrorTemplate default akan digunakan untuk
memberitahu pengguna ketika ada sebuah error validasi. ErrorTemplate yang default
adalah sebuah template kontrol yang menggambarkan sebuah border merah. Dengan
ErrorTemplate yang default dan ToolTip, TextBox StartDateEntryForm terlihat seperti
berikut ketika ada sebuah error validasi:
Gambar 6.5 Tampilan ErrorTemplate default dan ToolTip untuk sebuah error validasi
6.4 Kesimpulan
Saat ini tidak ada satu aplikasi bisnis apapun yang tidak melibatkan data. WPF
menyediakan berbagai macam pola pengikatan data yang menekankan pada sisi
interaktifitas dalam pengikatan dan sumber data yang beragam. Pengikatan data ini
dilengkapi dengan validasi data yang bersesuaian dan dapat dikostumisasi sesuai
dengan kebutuhan.
139 WPF, Just Code It!
7.1 Dokumen
7.1.1 Jenis-jenis Dokumen
7.1.1.1 Fix Document
Sebagai bagian dari layoutnya, sebuah fix document memelihara penempatan posisi
yang tepat atas elemen-elemen konten yang tidak bergantung pada perangkat printer
atau display yang sedang digunakan. Sebagai contoh, sebuah halaman fix document
yang ditampilkan pada display 96 dpi akan tampil persis sama ketika dicetak ke printer
laser 600 dpi seperti ketika dicetak ke phototypesetter 4800 dpi. Layout halaman masih
sama dalam semua kasus, sementara kualitas dokumen dimaksimalkan sesuai
kemampuan masing-masing perangkat.
Flow document dirancang untuk mengoptimalkan tampilan dan kemampuan dibaca dan
paling baik digunakan saat kemudahan pembacaan adalah skenario utama konsumsi
140 WPF, Just Code It!
Halaman Web adalah sebuah contoh sederhana dari sebuah flow document dimana
konten halaman secara dinamis diformat agar sesuai dengan jendela saat ini. Dokumen
alir mengoptimalkan pengalaman tampilan dan pembacaan bagi pengguna, berdasarkan
lingkungan runtime. Sebagai contoh, flow document yang sama akan secara dinamis
diformat ulang untuk kemampuan dibaca yang optimal pada display 19-inch resolusi
tinggi atau sebuah layar PDA 2x3-inch. Sebagai tambahan, flow document memiliki
sejumlah fitur-fitur built in termasuk pencarian, mode tampilan yang mengoptimalkan
kemampuan dibaca, dan kemampuan untuk mengubah ukuran dan tampilan font.
7.1.2.2.1 FlowDocumentReader
Secara default, sebuah scrollbar vertikal selalu ditampilkan, dan sebuah scrollbar
horizontal dapat dilihat jika perlu. UI default untuk FlowDocumentScrollViewer tidak
mencakup sebuah toolbar; meskipun demikian properti IsToolBarVisible dapat
digunakan untuk mengaktifkan toolbar built-in.
digital sah yang dapat digunakan untuk mengidentifikasi keaslian dari sebuah bagian
dan untuk memvalidasi bahwa konten dari sebuah package belum dimodifikasi.
Packages juga mencakup fitur PackageRelationship yang mengijinkan penambahan
informasi tambahan ke sebuah package atau diasosiasikan dengan bagian-bagian
tertentu tanpa memodifikasi konten dari part-part yang ada. Layanan Package juga
mendukung Microsoft Windows Rights Management (RM).
WPF packaging APIs mengijinkan dokumen dan data aplikasi untuk diorganisasikan
kedalam sebuah unit portable tunggal. Sebuah berkas ZIP adalah salah satu jenis
package umum dan merupakan jenis package default yang disediakan dengan WPF.
Package sendiri adalah sebuah kelas abstrak dimana ZipPackage diimplementasikan
menggunakan sebuah open standard XML dan arsitektur berkas ZIP. Metode Open
menggunakan ZipPackage untuk menciptakan dan menggunakan berkas-berkas ZIP
secara default. Sebuah package dapat memuat tiga jenis item dasar:
7.1.3.1.1 PackageParts
Sebuah PackagePart ("part") adalah sebuah kelas abstrak yang mengacu ke sebuah
obyek yang disimpan didalam sebuah Package. Didalam sebuah berkas ZIP, package
parts berkaitan dengan berkas-berkas individual yang disimpan didalam bekas ZIP.
ZipPackagePart menyediakan impelementasi default untuk obyek-obyek serializable
yang disimpan didalam sebuah ZipPackage. Seperti sebuah sistem berkas, bagian-bagian
yang dimuat didalam package disimpan didalam direktori hirarkis atau organisasi
"folder-style". Dengan menggunakan WPF packaging APIs, aplikasi dapat menulis,
menyimpan dan membaca banyak obyek PackagePart menggunakan sebuah kontainer
berkas ZIP tunggal.
7.1.3.1.2 PackageDigitalSignatures
Digital signature tidak menghalangi sebuah part untuk dimodifikasi, namun sebuah
pemeriksaan validasi yang melawan digital signature akan gagal jika part tersebut
diubah dengan cara apapun. Kemudian aplikasi dapat mengambil tindakan yang
145 WPF, Just Code It!
sesuai—sebagai contoh, blok yang membuka part atau memberitahu pengguna bahwa
part telah dimodifikasi dan tidak aman.
7.1.3.1.3 PackageRelationships
Bahkan jika diketahui, skema konten mungkin tidak menyediakan fungsi untuk
menambahkan informasi baru.
Dokumen XML Paper Specification (XPS) adalah sebuah package (pemaketan) yang
memuat satu atau lebih fix document bersama dengan semua sumber daya dan
informasi yang dibutuhkan untuk proses render. XPS juga merupakan format natif
berkas print spool Windows Vista. Sebuah XpsDocument disimpan didalam dataset ZIP
standard, dan dapat mencakup sebuah kombinasi XML dan komponen-komponen biner,
seperti berkas font dan image. PackageRelationships digunakan untuk menggambarkan
dependensi antara konten dan sumber daya yang dibutuhkan untuk merender dokumen
secara penuh. Desain XpsDocument menyediakan sebuah solusi dokumen tunggal
dengan ketepatan tinggi yang mendukung berbagai fungsi:
147 WPF, Just Code It!
Membaca, menulis, dan menyimpan konten dan sumber daya fix document
sebagai sebuah berkas tunggal, portable dan mudah didistribusikan.
7.2 Pencetakan
Pencetakan didalam WPF jauh lebih mudah dibandingkan pencetakan didalam Windows
Forms. Untuk sebagian besar dokumen, dukungan pencetakan sudah ada dan tidak
membutuhkan penulisan kode tambahan. Untuk jenis pencetakan lainnya, pencetakan
difasilitasi melalyi metode-metode dari kelas PrintDialog.
// C#
aViewer.Print();
// C#
PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() == true)
{
pd.PrintVisual(this,"The Window");
}
Sebuah Cara paling mudah untuk mencetak sebuah flow document adalah dengan
memanggil metode Print dari viewer yang memuat dokumen tersebut, atau dengan
membangkitkan perintah Print. Meskipun demikian, anda dapat menggunakan metode
PrintDocument untuk mencetak sebuah flow document secara manual yang ada didalam
memory.
// C#
PrintDialog pd = new PrintDialog();
if (pd.ShowDialog() == true)
{
DocumentPaginator aPag;
aPag = ((IDocumentPaginatorSource)myDocument).DocumentPaginator;
pd.PrintDocument(aPag, "My Document");
}
7.3 Kesimpulan
Apabila kita mengingat tentang pemograman ,NET sebelum versi 3.0, maka kita akan
mengingat betapa tingginya kebutuhan kita pada format dokumen pihak ketiga.
Lahirnya spesifikasi dan pustaka dokumen milik WPF, seakan menghadirkan babak baru
dunia pemograman pencetakan dan pengelolaan dokumen yang lebih mudah dan lebih
independen.
151 WPF, Just Code It!
8 WPF Multimedia
8.1 Multimedia
Topik ini memperkenalkan fitur-fitur multimedia dari WPF yang megizinkan Anda untuk
mengintegrasikan suara dan video kedalam aplikasi Anda dalam rangka meningkatkan
pengalaman pengguna.
MediaElement adalah sebuah UIElement yang didukung oleh The Layout System dan
dapat digunakan sebagai konten dari banyak kontrol. Ia juga dapat digunakan didalam
XAML seperti halnya kode. Pada sisi lain, MediaPlayer dirancang untuk obyek-obyek
Drawing dan kurang dukungan layout. Media yang dimuat menggunakan MediaPlayer
hanya dapat dihadirkan menggunakan VideoDrawing atau dengan berinteraksi langsung
dengan DrawingContext. MediaPlayer tidak dapat digunakan didalam XAML.
Ketika mendistribusikan media dengan aplikasi Anda, Anda tidak dapat menggunakan
sebuah berkas media sebagai sumber daya proyek. Didalam berkas proyek Anda, Anda
harus menetapkan Media type menjadi Content dan menetapkan
CopyToOutputDirectory menjadi PreserveNewest atau Always.
Media dapat dimuat dengan menetapkan properti Source milik obyek MediaElement
atau dengan memanggil metode Open milik obyek MediaPlayer.
Playback media dapat dikontrol oleh Clock. Metode-metode kontrol milik obyek
media tidak dapat digunakan.
C#
<!-- This page shows a simple usage of MediaElement -->
<Page x:Class="MediaElementExample.SimpleUsage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
154 WPF, Just Code It!
Title="SimpleUsage"
>
<StackPanel Margin="20">
<MediaElement Source="media/numbers-aud.wmv" />
</StackPanel>
</Page>
Dalam contoh diatas, media dimainkan secara otomatis sesegera setelah media dimuat.
Setelah media selesai dimainkan, media ditutup dan semua sumber daya media
dilepaskan (termasuk memori video). Ini adalah perilaku default dari obyek
MediaElement dan dikontrol oleh properti LoadedBehavior dan UnloadedBehavior.
1. UnloadedBehavior.
Ada ketika media tidak dimuat. UnloadedBehavior memastikan bahwa semua
sumber daya media dilepaskan secara default, bahkan ketika sebuah MediaClock
diasosiasikan dengan MediaElement.
155 WPF, Just Code It!
2. MediaClock.
Ada ketika media memiliki sebuah Clock. Jika media tidak dimuat, MediaClock
akan memberikan efek selama UnloadedBehavior bernilai Manual. Mode Clock
selalu mengesampingkan perilaku yang dimuat dari MediaElement.
3. LoadedBehavior.
Ada ketika media dimuat.
Dengan menetapkan properti Width dan Height akan menyebabkan media diregangkan
untuk mengisi area yang diberikan untuk MediaElement. Untuk mempertahankan aspek
rasio asli media, properti Width atau Height harus ditetapkan, salah satu saja, tidak
keduanya. Menetapkan properti Width dan Height akan menyebabkan media
dihadirkan dalam ukuran fix yang mungkin tidak diinginkan.
Untuk menghindari elemen berukuran fix, WPF dapat melakukan preroll terhadap
media. Hal ini dapat dilakukan dengan menetapkan LoadedBehavior menjadi Play atau
156 WPF, Just Code It!
Pause. Dalam keadaan Pause, media akan di preroll dan akan memberikan frame
pertama. Dalam keadaan Play, media akan di preroll dan mulai dimainkan.
Hanya ada dua cara untuk mengontrol playback media didalam MediaPlayer.
Secara teknis, sebuah MediaPlayer tidak dapat ditampilkan karena ia tak memiliki
representasi fisik. Meskipun demikian, ia tak dapat digunakan untuk menghadirkan
media didalam sebuah Drawing menggunakan kelas VideoDrawing. Contoh berikut
mendemonstrasikan penggunaan VideoDrawing untuk menampilkan media.
157 WPF, Just Code It!
C#
// Create a VideoDrawing.
MediaPlayer player = new MediaPlayer();
player.Open(new Uri(@"sampleMedia\xbox.wmv", UriKind.Relative));
VideoDrawing aVideoDrawing = new VideoDrawing();
aVideoDrawing.Rect = new Rect(0, 0, 100, 100);
aVideoDrawing.Player = player;
8.2 Animasi
Animasi adalah salah satu fitur baru dari WPF. Animasi megizinkan Anda untuk
mengubah nilai dari sebuah properti setelah melewati suatu periode waktu. Dengan
menggunakan teknik ini, Anda dapat menciptakan berbagai efek visual, termasuk
membuat kontrol membesar atau berpindah didalam UI, mengubah warna secara
berangsur, atau mengubah properti-properti lainnya sepanjang waktu. Menciptakan
sebuah animasi dalam mesin grafis sebelumnya merupakan sebuah proses yang
menghabiskan waktu, namun didalam WPF segalanya lebih sederhana dan Anda dapat
membangun animasi dengan mudah. Animasi merupakan bagian built-in dari XAML
sebagai bahasa markup untuk mendeklarasikan UI didalam WPF dan beberapa opsi
tersedia untuk membangun animasi.
Animasi didalam WPF mengacu ke perubahan properti secara otomatis selama periode
waktu tertentu. Anda dapat menganimasikan ukuran, lokasi, warna, atau properti lain
dari sebuah elemen atau properti-properti yang terkait dengan sebuah elemen. Anda
dapat menggunakan kelas Animation untuk mengimplementasikan perubahan-
perubahan ini.
158 WPF, Just Code It!
Kelas Animation adalah sebuah grup besar kelas yang dirancang untuk
mengimplementasikan perubahan properti secara otomatis. Ada 42 kelas Animation
didalam namespace System.Windows.Media.Animation, dan masing-masing memiliki
sebuah tipe data spesifik yang dirancang untuk dianimasikan.
Kelas Animation dibagi menjadi tiga grup dasar, yaitu animasi linier, animasi berbasis
key frame, dan animasi berbasis path.
Animasi linier, yang mengotomasi perubahan properti dalam sebuah cara yang
linier, diberi nama dalam format <TypeName>Animation, dimana <TypeName>
adalah nama tipe yang sedang dianimasikan. DoubleAnimation adalah sebuah
contoh dari kelas animasi linier, dan merupakan kelas animasi yang paling sering
digunakan.
Animasi berbasis key frame melakukan animasinya pada basis beberapa titik
jalan, yang disebut key frames. Aliran animasi key-frame dimulai pada bagian
awal, kemudian maju ke setiap key frame sampai ke bagian akhir. Animasi key-
frame diberi nama dalam format <TypeName>AnimationUsingKeyFrames,
dimana <TypeName> adalah nama Type yang sedang dianimasikan. Contohnya
StringAnimationUsingKeyFrames.
Animasi berbasis path menggunakan sebuah obyek Path untuk memandu
animasi. Animasi ini sering digunakan untuk menganimasikan properti-properi
yang terkait dengan perpindahan obyek-obyek visual sepanjang jalan yang
kompleks. Animasi berbasis path diberi nama dalam format
<TypeName>Animation-UsingPath, dimana <TypeName> adalah nama tipe yang
sedang dianimasikan. Saat ini hanya ada tiga kelas Animation berbasis path, yaitu
PointAnimationUsingPath, Double-AnimationUsingPath, dan
MatrixAnimationUsingPath.
Walaupun ada banyak kelas Animation yang berbeda, mereka semua bekerja dalam cara
fundamental yang sama. Demikian, mereka juga berbagi properti-properti yang umum.
Beberapa properti penting dari kelas Animation adalah sebagai berikut:
159 WPF, Just Code It!
Contoh berikut mendemonstrasikan sebuah animasi yang sangat sederhana. Animasi ini
mengubah nilai dari sebuah properti yang memiliki representasi tipe data Double dari 1
hingga 200 salama berjalan 10 detik:
Didalam contoh ini, properti Duration menetapkan durasi 10 detik untuk animasi
tersebut, serta properti From dan To menAndakan nilai awal sebesar 1 dan nilai akhir
sebesar 200.
8.2.2 StoryBoards
StoryBoard adalah elemen inti dari animasi. StoryBoards harus ada didalam sebuah
elemen BeginStoryBoard didalam event triggers. Setiap StoryBoard terdiri dari satu atau
lebih tipe animasi dasar untuk menganimasikan sebuah kontrol. Elemen ini memiliki dua
properti penting: StoryBoard.TargetName dan StoryBoard.TargetProperty. Storyboard
menetapkan nama elemen yang harus dianimasikan dan TargetName menetapkan
properti elemen yang harus dianimasikan oleh StoryBoard. StoryBoard.TargetProperty
harus ditetapkan ke properti yang benar berdasarkan pada hirarki elemen, sub-elemen
dan atribut didalam XAML.
Didalam StoryBoard Anda dapat menaruh satu atau lebih tipe animasi dasar
berdasarkan pada animasi yang ingin Anda bangun. Berikut adalah contoh kode untuk
menggunakan sebuah StoryBoards.
<Window x:Class="UniveRSS.Animations.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
161 WPF, Just Code It!
Didalam kode XAML diatas, warna background dari Button beranimasi dari Pink menjadi
Blue kemudian menjadi Green dalam 6 detik kapanpun pengguna menggerakkan mouse
diatas Button tersebut.
162 WPF, Just Code It!
Dengan menggunakan dua properti, Anda dapat mengubah perilaku dari animasi Anda
dalam dua cara. Anda dapat membalik animasi dengan menetapkan properti
AutoReverse dari setiap tipe animasi menjadi true. Anda juga dapat menetapkan
RepeatBehavior dari setiap tipe animasi dalam rangka mengatur jumlah iterasi untuk
masing-masing animasi. Anda dapat menetapkan properti ini menjadi Forever agar
animasi Anda berjalan selamanya (sampai Anda menghentikan aplikasi).
<Window x:Class="UniveRSS.Animations.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Animations in WPF" Height="300" Width="300">
<Grid>
<Grid.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard Storyboard.TargetName="myButton"
Storyboard.TargetProperty="(Background).
(SolidColorBrush.Color)">
163 WPF, Just Code It!
<ColorAnimation From="Pink"
To="Green"
By="Blue"
Duration="0:0:6"
RepeatBehavior="3x"
AutoReverse="True" />
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
<Button Name="myButton" Width="150" Height="35" Background="Pink">
Click Me!
</Button>
</Grid>
</Window>
Gambar 8.2 Animasi warna AutoReverse dan RepeatBehavior pada sebuah Button
8.2.4 Transformasi
<Window x:Class="UniveRSS.Animations.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Animations in WPF" Height="300" Width="300">
<Grid>
<Grid.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard Storyboard.TargetName="myButton"
Storyboard.TargetProperty="(RenderTransform).
(RotateTransform.Angle)">
<DoubleAnimation From="0"
To="180"
By="90"
Duration="0:0:6"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
<Button Name="myButton" Width="150" Height="35" Background="Pink">
Click Me!
</Button>
</Grid>
</Window>
165 WPF, Just Code It!
8.2.5 ParallelTimeLine
Kadangkala Anda perlu menciptakan dua atau lebih animasi yang berjalan secara
paralel. Hal ini sangat mudah diwujudkan didalam WPF. Yang perlu Anda lakukan
hanyalah meletakkan StoryBoards Anda didalam elemen ParallelTimeLine didalam
StoryBoard induk. Dengan cara ini, semua StoryBoards tersebut dan animasi mereka
akan berjalan secara paralel.
Berikut adalah contoh dari ParallelTimeLine dimana sebuah Button dianimasikan untuk
berubah warna backgroundnya sembari sudut RenderTransform nya berubah dari 0 ke
180 derajat. Anda tinggal menggabungkan dua animasi yang telah Anda buat dalam
contoh pertama dan contoh ketiga.
<Window x:Class="UniveRSS.Animations.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Animations in WPF" Height="300" Width="300">
<Grid>
<Grid.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<ParallelTimeline>
166 WPF, Just Code It!
<Storyboard Storyboard.TargetName="myButton"
Storyboard.TargetProperty="(Background).
(SolidColorBrush.Color)">
<ColorAnimation From="Pink"
To="Green"
By="Blue"
Duration="0:0:6" />
</Storyboard>
<Storyboard Storyboard.TargetName="myButton"
Storyboard.TargetProperty="(RenderTransform).
(RotateTransform.Angle)">
<DoubleAnimationFrom="0"
To="180"
By="90"
Duration="0:0:6" />
</Storyboard>
</ParallelTimeline>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
<Button Name="myButton" Width="150" Height="35"
Background="Pink">
<Button.RenderTransform>
<RotateTransform Angle="0"CenterX="105"CenterY="30" />
</Button.RenderTransform>
Click Me!
</Button>
</Grid>
</Window>
167 WPF, Just Code It!
8.2.6 KeyFrame
Secara default, semua tipe animasi built-in menggunakan sebuah cara simetris untuk
menganimasikan elemen-elemen dan membagi waktu total menjadi frame-frame yang
sebanding. Namun kadangkala Anda perlu mengatur panjang waktu dimana masing-
masing frame animasi muncul dalam keluaran. Dalam kasus ini, Anda dapat
mendeklarasikan nilai-nilai yang berbeda untuk frame-frame yang berbeda dengan
menggunakan tipe-tipe KeyFrames yang berbeda.
Setiap tipe animasi dasar memiliki sebuah KeyFrame yang bersesuaian agar Anda dapat
mendeklarasikan KeyFrame untuk tipe tersebut. Pada contoh berikut,
LinearDoubleKeyFrames digunakan untuk mengubah Width dari sebuah Button dari 60
menjadi 120 dengan nilai-nilai yang berbeda pada setiap frame waktu.
<Window x:Class="UniveRSS.Animations.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Animations in WPF" Height="300" Width="300">
<Grid>
<Grid.Triggers>
<EventTrigger RoutedEvent="Rectangle.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard Storyboard.TargetName="myButton"
168 WPF, Just Code It!
Storyboard.TargetProperty="Width">
<DoubleAnimationUsingKeyFrames Duration="0:0:8">
<LinearDoubleKeyFrame KeyTime="0:0:2" Value="60"/>
<LinearDoubleKeyFrame KeyTime="0:0:4" Value="80"/>
<LinearDoubleKeyFrame KeyTime="0:0:6" Value="100"/>
<LinearDoubleKeyFrame KeyTime="0:0:8" Value="120"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Grid.Triggers>
<Button Name="myButton" Width="60" Height="35" Background="Pink">
Click Me!
</Button>
</Grid>
</Window>
8.3 Kesimpulan
Salah satu hal yang menarik dari sebuah aplikasi adalah sisi dinamis dari aplikasi
tersebut. Kedinamisan Aplikasi dapat dicapai melalui teknik animasi dan kekayaan
multimedia aplikasi itu sendiri. WPF menghadirkan secara built-in teknologi multimedia
dan animasi, bayangkan pada masa sebelum era WPF yang masih bergantung pada
active-x animasi dan multimedia pihak ketiga yang harus Anda peroleh di luar sana.
170 WPF, Just Code It!
9 WPF Interoperability
Host Kontrol WPF didalam Windows Form. Pada bagian ini kunci utamanya
adalah kelas ElementHost yang menangani komunikasi kontrol WPF didalam
Windows Form.
Host Kontrol Windows Forms didalam WPF. Pada mekanisme ini kunci utamanya
adalah kelas WindowsFormHost yang menjadi kontainer kontrol Windows Form
didalam WPF.
Kedua kemampuan ini menarik sebagai contoh hosting kontrol WPF kedalam Windows
Form yang akan memfasilitasi pihak-pihak yang telah memiliki investasi kode di
Windows Form untuk meningkatkan UX aplikasinya dengan menambahkan WPF
Contents, hal yang sebaliknya juga berlaku pada kondisi-kondisi tertentu.
Jika Anda ingin mendayagunakan kembali investasi kode Anda didalam aplikasi Windows
Forms dan menikmati fitur-fitur canggih dari WPF, Anda dapat memilih untuk
menyimpan aplikasi Windows Forms Anda tetap utuh dan memigrasi bagian-bagian dari
aplikasi Anda ke WPF. Anda dapat melakukannya dengan mengidentifikasi area-area
171 WPF, Just Code It!
dari aplikasi Anda yang sesuai denan fitur-fitur WPF dan mengkonversi area-area
tersebut ke WPF. Sebagai contoh, Anda mungkin ingin mengkonversi beberapa form
Anda ke WPF. Dengan menggunakan metode ini, Anda hanya akan memunculkan
instan-instan halaman-halaman atau jendela-jendela WPF dari aplikasi Windows Forms
Anda. Apalagi, Anda mungkin ingin benar-benar mengeluarkan kontrol-kontrol Windows
Forms ke kontrol-kontrol WPF pada sebuah form yang menghasilkan form hibrid dan
kontrol-kontrol tersebut bisa berdampingan dengan selaras.
// Add the host control to the WPF element that you want to parent the
// control, in this case it's a Grid
this.grid1.Children.Add(host);
172 WPF, Just Code It!
<?Mapping XmlNamespace="wfi"
ClrNamespace="System.Windows.Forms.Integration"
Assembly="WindowsFormsIntegration"?>
<?Mapping XmlNamespace="wf" ClrNamespace="System.Windows.Forms"
Assembly="System.Windows.Forms"?>
Properti XmlNamespace menyediakan jalan untuk menciptakan sebuah tag yang dapat
Anda gunakan sebagai prefiks namespace didalam XAML untuk mengacu ke kontrol-
kontrol didalam namespace System.Windows.Forms dan
System.Windows.Forms.Integration. Untuk mengaktifkannya, Anda juga harus
menciptakan properti xmlns didalam XAML yang memetakan kembali ke prefiks-prefiks
tersebut:
<Window x:Class="AvalonApplication17.Window1"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
xmlns:wfi="wfi"
xmlns:wf="wf"
Title="AvalonApplication17"
Loaded="WindowLoaded"
>
<Grid x:Name="grid1">
<wfi:WindowsFormsHost>
<wf:Button Text="Windows Forms Button"/>
</wfi:WindowsFormsHost>
</Grid>
173 WPF, Just Code It!
Meskipun demikian, jika Anda ingin menggunakan XAML untuk mendeskripsikan kontrol
WPF yang ingin Anda gunakan didalam aplikasi Windows Forms, Anda perlu
menambahkan sebuah item UserControl ke proyek Anda. Hal ini akan menciptakan
berkas UserControl1.xaml dan berkas UserControl1.xaml.cs. Kemudian Anda dapat
memodifikasi berkas UserControl1.xaml untuk memuat XAML yang ingin Anda gunakan
untuk mendeskripsikan kontrol Anda. Kemudian Anda tinggal menciptakan sebuah
instan dari kontrol ini dan menambahkannya ke kontrol ElementHost seperti contoh
berikut:
Sebagai tambahan, Anda perlu memodifikasi berkas proyek tersebut karena Windows
Application tidak mengetahui apa yang harus dilakukan dengan berkas XAML. Anda
harus membuka berkas proyek (.csproj, .vbproj, etc.) didalam sebuah editor seperti
Notepad dan kemudian gulung kebawah. Anda akan melihat baris berikut:
Anda harus menyalin baris ini dan menempelkannya dibawah baris tersebut dan
kemudian ubah "CSharp" menjadi "WinFX" sehingga kedua baris tersebut terlihat
seperti:
Sekarang simpan berkas ini dan muat kembali proyek tersebut menggunakan Visual
Studio dan jalankan aplikasi tersebut.
ClickOnce menyediakan berbagai kontrol selama instalasi aplikasi Anda. Anda dapat
mengkonfigurasi aplikasi untuk stand-alone deployment atau mengharuskan pengguna
untuk menjalankan aplikasi dari sebuah server. Bagian ini menjelaskan berbagai opsi
yang dihadirkan oleh ClickOnce deployment.
aplikasi-aplikasi yang disebarkan dari sebuah Web site, file share, atau CD-ROM. Anda
dapat mengkonfigurasi aplikasi ClickOnce untuk dijalankan hanya ketika pengguna
online atau ketika off-line.
Aplikasi ClickOnce terisolasi dari sisa sistem. Karena mereka seutuhnya memuat dirinya
sendiri, mereka tidak berbagi komponen dengan aplikasi-aplikasi lain yang terinstal pada
komputer dan tidak beresiko merusak instalasi aplikasi lain.
Anda dapat menyebarkan sebuah aplikasi secara langsung didalam Visual Studio dari tab
Publish dari kotak dialog Project properties. Untuk membuka tab Publish, klik kanan
proyek didalam Solution Explorer, pilih Properties, dan kemudian pilih tab Publish.
Terbukalah Publish properties page.
176 WPF, Just Code It!
Untuk memungkinkan aplikasi memeriksa update, pilih check box yang berlabel The
Application Should Check For Updates. Hal ini mengaktifkan opsi-opsi lain didalam kotak
dialog.
177 WPF, Just Code It!
Anda dapat menentukan kapan aplikasi memeriksa update dengan memilih salah satu
antara After The Application Starts atau Before The Application Starts. Jika Anda
memilih Before The Application Starts, aplikasi memeriksa update baru setiap kali
aplikasi dijalankan. Hal ini memastikan bahwa pengguna selalu menjalankan aplikasi
versi terbaru, namun hal ini juga memperlambat performa aplikasi pada saat startup.
Jika Anda memilih After The Application Starts, Anda dapat menentukan bahwa aplikasi
memeriksa update setiap kali aplikasi dijalankan, atau pada interval waktu yang
diinginkan dengan memilih opsi yang sesuai dibawah Specify How Frequently The
Application Should Check For Updates. Anda juga dapat menentukan versi minimum
yang dibutuhkan untuk aplikasi, dan Anda dapat menentukan lokasi yang berbeda untuk
update jika update Anda diletakkan didalam sebuah lokasi yang berbeda dari lokasi
instalasi.
Anda mungkin ingin memberikan opsi bagi pengguna untuk memeriksa update, selain
menggunakan jadwal. Anda dapat menambahkan fungsionalitas kedalam aplikasi Anda
untuk memeriksa dan menginstal update secara manual. Sebagai contoh, Anda mungkin
menyediakan sebuah opsi menu yang bernama Check For Updates.
System.Deployment.Application.ApplicationDeployment aDep;
aDep =
System.Deployment.Application.ApplicationDeployment.CurrentDeployment;
178 WPF, Just Code It!
if (aDep.CheckForUpdate())
{
aDep.Update();
}
Metode CheckForUpdate dan Update juga memiliki rekanan asinkron, yang berturut-
turut disebut CheckForUpdateAsync dan UpdateAsync, yang dapat digunakan untuk
melakukan update secara asinkron. Ketika CheckForUpdateAsync kembali, ia
membangkitkan event CheckForUpdateCompleted. Dengan menangani event ini, Anda
dapat melakukan query terhadap argumen Check-ForUpdateCompletedEventArgs
didalam event handler untuk menentukan apakah sebuah update tersedia. Jika update
tersedia, Anda dapat memanggil UpdateAsync untuk mengunduh dan menginstal
update secara asinkron. Jika aplikasi sedang berjalan, maka update diterapkan setelah
aplikasi berakhir, sehingga update tidak akan terlihat sampai aplikasi di-restart.
System.Deployment.Application.ApplicationDeployment aDep;
public myApplication
{
InitializeComponent();
aDep=System.Deployment.Application.ApplicationDeployment.CurrentDeplo
yment;
aDep.CheckForUpdateCompleted += UpdateCheckCompleted;
}
Application settings dan default user settings disimpan didalam berkas .config milik
aplikasi. Biasanya pengaturan-pengaturan tersebut diupdate dengan setiap update
aplikasi baru. Meskipun demikian, user settings yang telah dimodifikasi oleh pengguna
disimpan didalam sebuah berkas lokal yang terpisah dari berkas .config. Sehingga tidak
ada usaha tambahan yang dibutuhkan untuk memigrasi user settings ketika sebuah
aplikasi diupdate.
Dengan ClickOnce, XBAPs dapat disebarkan dalam cara yang sama seperti sebuah
Windows application atau Navigation application. Semua properti publikasi ClickOnce
juga diterapkan ke XBAPs, namun ada sedikit yang khusus untuk XBAP saja.
XBAPs berjalan didalam browser dan biasanya dijalankan dari sebuah Web site.
Sehingga, mereka hampir selalu berjalan dibawah partial trust. Anda harus merancang
aplikasi XBAP Anda untuk eksekusi didalam lingkungan partial-trust dan menguji mereka
didalam lingkungan kepercayaan yang sama dengan lingkungan yang akan digunakan
oleh pengguna.
Ketika merancang sebuah aplikasi untuk eksekusi didalam sebuah lingkungan partial-
trust, Anda harus menghindari fitur-fitur kode yang membutuhkan akses ke sumber
daya sistem terproteksi. Sebagai contoh, Anda tidak boleh mencoba untuk mengakses
sistem berkas atau registry didalam sebuah XBAP. Anda dapat menggunakan tool-tool
built-in untuk mengindikasi ijin-ijin yang dibutuhkan oleh aplikasi Anda.
Anda dapat mengkonfigurasi kebutuhan keamanan akses kode pada Security properties
page, yang dapat Anda akses dengan klik kanan proyek Anda, pilih Properties, dan
kemudian pilih tab Security.
Anda dapat mengkonfigurasi ijin-ijin yang diminta oleh aplikasi Anda didalam halaman
ini dengan memilih Enable ClickOnce Security Settings check box dan kemudian memilih
radio button yang berlabel This Is A Partial Trust Application. ClickOnce Security
Permissions group dibawah radio button ini digunakan untuk mengkonfigurasi ijin yang
diminta oleh aplikasi Anda.
Anda apat menetapkan ijin-ijin yang diminta menjadi defaults yang diperbolehkan oleh
Internet atau local intranet zones dengan memilih zona didalam drop-down box berlabel
Zone Your Application Will Be Installed From. Anda juga dapat menciptakan permintaan
keamanan khusus dengan memilih (Custom) didalam drop-down box dan kemudian
secara individual mengatur setiap ijin menjadi Include atau Exclude didalam kolom
Setting. Jika ijin-ijin yang diminta melanggar kebijakan keamanan lokal dari komputer
yang mengeksekusi, aplikasi tidak akan dijalankan.
Berikut adalah daftar operasi-operasi umum yang tidak aman didalam lingkungan
partial-trust.
181 WPF, Just Code It!
Tabel 9.1 Fitur-fitur yang tidak aman digunakan dalam lingkungan Partial-Trust
Fitur Fitur-fitur Area
General Window (Application-Defined Windows and Dialog Boxes)
SaveFileDialog
File System
Registry Access
Drag And Drop
XAML Serialization (via XamlWriter.Save)
UIAutomation Clients
Source Window Access (HwndHost)
Full Speech Support
Windows Forms Interoperability
Web Web Services (using Windows Communication Foundation)
Integration Scripting
Document Object Model
Visuals Bitmap Effects
Editing Rich Text Format Clipboard
Full XAML support
try
{
182 WPF, Just Code It!
System.Security.Permissions.FileIOPermission perm =
new System.Security.Permissions.FileIOPermission(
System.Security.Permissions.FileIOPermissionAccess.AllAccess,
"C:\\myFile");
perm.Demand();
// proceed with writing the file
}
catch
{
// recover from being unable to write the file
}
9.3 Kesimpulan
Tidak semuanya dikembangkan mulai dari nol, sekiranya itulah pesan pada bab ini. WPF
memungkinkan kita untuk melakukan mekanisme interoperabilitas ditingkat teknologi.
Walaupun pada bab ini dikemukakan bahwa interoperabilitasnya sebatas teknologi lain
yang berumpun dari .NET , hal ini akan cukup membantu bagi para pengembang yang
telah memiliki cukup investasi pada kode sebelumnya. Sama halnya dengan dukungan
kompatibilitas, aplikasi WPF juga mendukung distribusi ala Smart Client yang telah lama
diusung pada .NET Framework. Pengembang dapat mendeploy aplikasi WPF sebagai
aplikasi standalone atau yang berjalan di atas browser (XBAP) dan kesemuanya
didukung oleh teknologi dengan nama Smart Client.