Bagikan melalui


Gambaran umum WPF

Windows Presentation Foundation (WPF) memungkinkan Anda membuat aplikasi klien desktop untuk Windows dengan pengalaman pengguna yang menakjubkan secara visual.

Contoso Healthcare UI sample

Inti dari WPF adalah mesin rendering berbasis resolusi dan berbasis vektor yang dibangun untuk memanfaatkan perangkat keras grafis modern. WPF memperluas inti dengan serangkaian fitur pengembangan aplikasi yang komprehensif yang mencakup Extensible Application Markup Language (XAML), kontrol, pengikatan data, tata letak, grafik 2D dan 3D, animasi, gaya, templat, dokumen, media, teks, dan tipografi. WPF adalah bagian dari .NET, sehingga Anda dapat membangun aplikasi yang menggabungkan elemen lain dari .NET API.

Gambaran Umum ini ditujukan untuk pendatang baru dan mencakup kemampuan dan konsep utama WPF.

Program dengan WPF

WPF ada sebagai subset jenis .NET yang (sebagian besar) terletak di System.Windows namespace layanan. Jika sebelumnya Anda telah membangun aplikasi dengan .NET menggunakan teknologi terkelola seperti ASP.NET dan Formulir Windows, pengalaman pemrograman WPF dasar harus akrab; Anda membuat instans kelas, mengatur properti, metode panggilan, dan menangani peristiwa, menggunakan bahasa pemrograman .NET favorit Anda, seperti C# atau Visual Basic.

WPF mencakup konstruksi pemrograman tambahan yang meningkatkan properti dan peristiwa: properti dependensi dan peristiwa yang dirutekan.

Markup dan code-behind

WPF memungkinkan Anda mengembangkan aplikasi menggunakan markup dan code-behind, pengalaman yang harus dipahami oleh pengembang ASP.NET. Anda biasanya menggunakan markup XAML untuk menerapkan tampilan aplikasi saat menggunakan bahasa pemrograman terkelola (code-behind) untuk menerapkan perilakunya. Pemisahan penampilan dan perilaku ini memiliki manfaat sebagai berikut:

  • Biaya pengembangan dan pemeliharaan berkurang karena markup khusus penampilan tidak digabungkan erat dengan kode khusus perilaku.

  • Pengembangan lebih efisien karena perancang dapat menerapkan tampilan aplikasi secara bersamaan dengan pengembang yang menerapkan perilaku aplikasi.

  • Globalisasi dan lokalisasi untuk aplikasi WPF disederhanakan.

Markup

XAML adalah bahasa markup berbasis XML yang menerapkan tampilan aplikasi secara deklaratif. Anda biasanya menggunakannya untuk membuat jendela, kotak dialog, halaman, dan kontrol pengguna, dan untuk mengisinya dengan kontrol, bentuk, dan grafik.

Contoh berikut menggunakan XAML untuk menerapkan tampilan jendela yang berisi satu tombol:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Title="Window with Button"
    Width="250" Height="100">

  <!-- Add button to window -->
  <Button Name="button">Click Me!</Button>

</Window>

Secara khusus, XAML ini mendefinisikan jendela dan tombol dengan menggunakan Window elemen dan Button . Setiap elemen dikonfigurasi dengan atribut, seperti atribut Window elemen Title untuk menentukan teks bilah judul jendela. Pada saat dijalankan, WPF mengonversi elemen dan atribut yang didefinisikan dalam markup menjadi instans kelas WPF. Misalnya, elemen Window dikonversi menjadi turunan kelas Window yang properti Title-nya adalah nilai atribut Title.

Gambar berikut menunjukkan antarmuka pengguna (UI) yang didefinisikan oleh XAML pada contoh sebelumnya:

A window that contains a button

Karena XAML berbasis XML, UI yang Anda buat dengannya dirakit dalam hierarki elemen berlapis yang dikenal sebagai pohon elemen. Pohon elemen menyediakan cara yang logis dan intuitif untuk membuat dan mengelola UI.

Code-behind

Perilaku utama aplikasi adalah menerapkan fungsionalitas yang merespons interaksi pengguna, termasuk menangani peristiwa (misalnya, mengklik menu, bilah alat, atau tombol) dan memanggil logika bisnis dan logika akses data sebagai respons. Di WPF, perilaku ini diterapkan dalam kode yang terkait dengan markup. Jenis kode ini dikenal sebagai code-behind. Contoh berikut menunjukkan markup yang diperbarui dari contoh sebelumnya dan code-behind:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.AWindow"
    Title="Window with Button"
    Width="250" Height="100">

  <!-- Add button to window -->
  <Button Name="button" Click="button_Click">Click Me!</Button>

</Window>
using System.Windows; // Window, RoutedEventArgs, MessageBox

namespace SDKSample
{
    public partial class AWindow : Window
    {
        public AWindow()
        {
            // InitializeComponent call is required to merge the UI
            // that is defined in markup with this class, including  
            // setting properties and registering event handlers
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            // Show message box when button is clicked.
            MessageBox.Show("Hello, Windows Presentation Foundation!");
        }
    }
}
Namespace SDKSample

    Partial Public Class AWindow
        Inherits System.Windows.Window

        Public Sub New()

            ' InitializeComponent call is required to merge the UI
            ' that is defined in markup with this class, including  
            ' setting properties and registering event handlers
            InitializeComponent()

        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)

            ' Show message box when button is clicked.
            MessageBox.Show("Hello, Windows Presentation Foundation!")

        End Sub

    End Class

End Namespace

Dalam contoh ini, code-behind mengimplementasikan kelas yang berasal dari Window kelas . Atribut x:Class digunakan untuk mengaitkan markup dengan kelas code-behind. InitializeComponent dipanggil dari konstruktor kelas code-behind untuk menggabungkan UI yang didefinisikan dalam markup dengan kelas code-behind. (InitializeComponent dihasilkan untuk Anda ketika aplikasi Anda dibangun, itulah sebabnya Anda tidak perlu menerapkannya secara manual.) Kombinasi x:Class dan InitializeComponent pastikan bahwa implementasi Anda diinisialisasi dengan benar setiap kali dibuat. Kelas code-behind juga mengimplementasikan penanganan aktivitas untuk peristiwa tombol Click . Saat tombol diklik, penanganan aktivitas memperlihatkan kotak pesan dengan memanggil System.Windows.MessageBox.Show metode .

Gambar berikut menunjukkan hasil ketika tombol diklik:

A MessageBox

Kontrol

Pengalaman pengguna yang disampaikan oleh model aplikasi adalah kontrol yang dibangun. Di WPF, kontrol adalah istilah payung yang berlaku untuk kategori kelas WPF yang dihosting di jendela atau halaman, memiliki antarmuka pengguna, dan menerapkan beberapa perilaku.

Untuk informasi lebih lanjut, lihat Kontrol.

Kontrol WPF berdasarkan fungsi

Kontrol WPF bawaan tercantum di sini:

Input dan perintah

Kontrol paling sering mendeteksi dan merespons input pengguna. Sistem input WPF menggunakan peristiwa langsung dan rute untuk mendukung input teks, manajemen fokus, dan posisi mouse.

Aplikasi seringkali memiliki persyaratan input yang rumit. WPF menyediakan sistem perintah yang memisahkan tindakan input pengguna dari kode yang merespons tindakan tersebut.

Tata letak

Saat membuat antarmuka pengguna, Anda mengatur kontrol berdasarkan lokasi dan ukuran untuk membentuk tata letak. Persyaratan utama tata letak apa pun adalah beradaptasi dengan perubahan ukuran jendela dan pengaturan tampilan. Daripada memaksa Anda untuk menulis kode untuk mengadaptasi tata letak dalam keadaan ini, WPF menyediakan sistem tata letak kelas satu yang dapat diperluas untuk Anda.

Landasan sistem tata letak adalah penentuan posisi relatif, yang meningkatkan kemampuan untuk beradaptasi dengan perubahan kondisi jendela dan tampilan. Selain itu, sistem tata letak mengelola negosiasi antara kontrol untuk menentukan tata letak. Negosiasi adalah proses dua langkah: pertama, kontrol memberi tahu induknya lokasi dan ukuran apa yang diperlukan; kedua, induk memberi tahu kontrol ruang apa yang dapat dimilikinya.

Sistem tata letak diekspos ke kontrol turunan melalui kelas WPF dasar. Untuk tata letak umum seperti kisi, tumpukan, dan dok, WPF menyertakan beberapa kontrol tata letak:

  • Canvas: Kontrol turunan menyediakan tata letaknya sendiri.

  • DockPanel: Kontrol turunan disejajarkan dengan tepi panel.

  • Grid: Kontrol turunan ditempatkan berdasarkan baris dan kolom.

  • StackPanel: Kontrol turunan ditumpuk baik secara vertikal maupun horizontal.

  • VirtualizingStackPanel: Kontrol turunan divirtualisasikan dan diatur pada satu baris yang berorientasi horizontal atau vertikal.

  • WrapPanel: Kontrol anak diposisikan dalam urutan kiri-ke-kanan dan dibungkus ke baris berikutnya ketika ada lebih banyak kontrol pada baris saat ini daripada ruang yang diizinkan.

Contoh berikut menggunakan DockPanel untuk menata beberapa TextBox kontrol:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.LayoutWindow"
    Title="Layout with the DockPanel" Height="143" Width="319">
  
  <!--DockPanel to layout four text boxes--> 
  <DockPanel>
    <TextBox DockPanel.Dock="Top">Dock = "Top"</TextBox>
    <TextBox DockPanel.Dock="Bottom">Dock = "Bottom"</TextBox>
    <TextBox DockPanel.Dock="Left">Dock = "Left"</TextBox>
    <TextBox Background="White">This TextBox "fills" the remaining space.</TextBox>
  </DockPanel>

</Window>

DockPanel memungkinkan kontrol TextBox turunan untuk memberi tahu cara mengaturnya. Untuk melakukannya, DockPanel menerapkan properti terlampir Dock yang diekspos ke kontrol turunan untuk memungkinkan masing-masing dari mereka menentukan gaya dok.

Catatan

Properti yang diterapkan oleh kontrol induk untuk digunakan oleh kontrol turunan adalah konstruksi WPF yang disebut properti terlampir.

Gambar berikut menunjukkan hasil markup XAML pada contoh sebelumnya:

DockPanel page

Pengikatan data

Sebagian besar aplikasi dibuat untuk menyediakan sarana bagi pengguna untuk melihat dan mengedit data. Untuk aplikasi WPF, pekerjaan menyimpan dan mengakses data sudah disediakan oleh teknologi seperti SQL Server dan ADO .NET. Setelah data diakses dan dimuat ke objek yang dikelola aplikasi, kerja keras untuk aplikasi WPF dimulai. Pada dasarnya, ini melibatkan dua hal:

  1. Menyalin data dari objek yang dikelola ke dalam kontrol, tempat data dapat ditampilkan dan diedit.

  2. Memastikan bahwa perubahan yang dibuat pada data dengan menggunakan kontrol disalin kembali ke objek yang dikelola.

Untuk menyederhanakan pengembangan aplikasi, WPF menyediakan mesin pengikatan data untuk melakukan langkah-langkah ini secara otomatis. Unit inti dari mesin pengikatan data adalah kelas Binding, yang tugasnya adalah mengikat kontrol (mengikat target) ke objek data (sumber pengikatan). Hubungan ini diilustrasikan oleh gambar berikut:

Basic data binding diagram

Contoh berikutnya menunjukkan cara mengikat TextBox ke instans objek kustom Person . Implementasi Person ditunjukkan dalam kode berikut:

Namespace SDKSample

    Class Person

        Private _name As String = "No Name"

        Public Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property

    End Class

End Namespace
namespace SDKSample
{
    class Person
    {
        string name = "No Name";

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }
}

Markup berikut mengikat ke instans TextBox objek kustom Person :

 <Window
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     x:Class="SDKSample.DataBindingWindow">

   <!-- Bind the TextBox to the data source (TextBox.Text to Person.Name) -->
   <TextBox Name="personNameTextBox" Text="{Binding Path=Name}" />

 </Window>
Imports System.Windows ' Window

Namespace SDKSample

    Partial Public Class DataBindingWindow
        Inherits Window

        Public Sub New()
            InitializeComponent()

            ' Create Person data source
            Dim person As Person = New Person()

            ' Make data source available for binding
            Me.DataContext = person

        End Sub

    End Class

End Namespace
using System.Windows; // Window

namespace SDKSample
{
    public partial class DataBindingWindow : Window
    {
        public DataBindingWindow()
        {
            InitializeComponent();

            // Create Person data source
            Person person = new Person();

            // Make data source available for binding
            this.DataContext = person;
        }
    }
}

Dalam contoh ini, Person kelas dibuat dalam code-behind dan diatur sebagai konteks data untuk DataBindingWindow. Dalam markup, Text properti terikat TextBox ke Person.Name properti (menggunakan sintaks XAML "{Binding ... }"). XAML ini memberi tahu WPF untuk mengikat TextBox kontrol ke Person objek yang disimpan di DataContext properti jendela.

Mesin pengikatan data WPF menyediakan dukungan tambahan yang mencakup validasi, pengurutan, pemfilteran, dan pengelompokan. Selain itu, pengikatan data mendukung penggunaan templat data untuk membuat antarmuka pengguna kustom untuk data terikat ketika antarmuka pengguna yang ditampilkan oleh kontrol WPF standar tidak sesuai.

Untuk informasi lebih lanjut, lihat Gambaran Umum pengikatan data.

Grafik

WPF memperkenalkan serangkaian fitur grafis yang luas, dapat diskalakan, dan fleksibel yang memiliki manfaat berikut:

  • Grafik yang tidak bergantung pada resolusi dan tidak bergantung pada perangkat. Unit pengukuran dasar dalam sistem grafis WPF adalah piksel independen perangkat, yaitu 1/96 inci, terlepas dari resolusi layar aktual, dan menyediakan fondasi untuk penyajian bebas resolusi dan independen perangkat. Setiap piksel yang tidak tergantung pada perangkat secara otomatis diskalakan agar sesuai dengan pengaturan titik per inci (dpi) dari sistem yang dirender.

  • Presisi yang ditingkatkan. Sistem koordinat WPF diukur dengan angka floating-point presisi ganda, bukan presisi tunggal. Transformasi dan nilai opasitas juga dinyatakan sebagai presisi ganda. WPF juga mendukung wide color gamut (scRGB) dan menyediakan dukungan terintegrasi untuk mengelola input dari ruang warna yang berbeda.

  • Dukungan grafis dan animasi tingkat lanjut. WPF menyederhanakan pemrograman grafis dengan mengelola adegan animasi untuk Anda; tidak perlu khawatir tentang pemrosesan adegan, perulangan penyajian, dan interpolasi bilinear. Selain itu, WPF menyediakan dukungan pengujian hit dan dukungan penuh alpha-compositing.

  • Akselerasi perangkat keras. Sistem grafis WPF memanfaatkan perangkat keras grafis untuk meminimalkan penggunaan CPU.

Bentuk 2D

WPF menyediakan pustaka bentuk 2D umum yang digambar vektor, seperti persegi panjang dan elipsis yang diperlihatkan dalam ilustrasi berikut:

Ellipses and rectangles

Kemampuan bentuk yang menarik adalah bahwa bentuk tersebut tidak hanya untuk ditampilkan; bentuk mengimplementasikan banyak fitur yang Anda harapkan dari kontrol, termasuk keyboard dan input mouse. Contoh berikut menunjukkan MouseUp peristiwa yang Ellipse sedang ditangani:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.EllipseEventHandlingWindow"
    Title="Click the Ellipse">
    <Ellipse Name="clickableEllipse" Fill="Blue" MouseUp="clickableEllipse_MouseUp" />
</Window>
Imports System.Windows ' Window, MessageBox
Imports System.Windows.Input ' MouseButtonEventArgs

Namespace SDKSample

    Public Class EllipseEventHandlingWindow
        Inherits Window

        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub clickableEllipse_MouseUp(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
            MessageBox.Show("You clicked the ellipse!")
        End Sub

    End Class

End Namespace
using System.Windows; // Window, MessageBox
using System.Windows.Input; // MouseButtonEventHandler

namespace SDKSample
{
    public partial class EllipseEventHandlingWindow : Window
    {
        public EllipseEventHandlingWindow()
        {
            InitializeComponent();
        }

        void clickableEllipse_MouseUp(object sender, MouseButtonEventArgs e)
        {
            // Display a message
            MessageBox.Show("You clicked the ellipse!");
        }
    }
}

Gambar berikut menunjukkan apa yang dihasilkan oleh kode sebelumnya:

A window with the text

Untuk informasi selengkapnya, lihat Bentuk dan gambar dasar dalam gambaran umum WPF.

Geometri 2D

Bentuk 2D yang disediakan oleh WPF mencakup set standar bentuk dasar. Namun, Anda mungkin perlu membuat bentuk kustom untuk memfasilitasi desain antarmuka pengguna yang disesuaikan. Untuk tujuan ini, WPF menyediakan geometri. Gambar berikut menunjukkan penggunaan geometri untuk membuat bentuk kustom yang dapat digambar secara langsung, digunakan sebagai kuas, atau digunakan untuk mengklip bentuk dan kontrol lainnya.

Path objek dapat digunakan untuk menggambar bentuk tertutup atau terbuka, beberapa bentuk, dan bahkan bentuk melengkung.

Geometry objek dapat digunakan untuk mengklip, menguji klik, dan merender data grafik 2D.

Various uses of a path

Untuk informasi lebih lanjut, lihat Gambaran Umum geometri.

Efek 2D

Bagian dari kemampuan WPF 2D mencakup efek visual, seperti gradien, bitmap, gambar, lukisan dengan video, rotasi, penskalaan, dan kemiringan. Ini semua dicapai dengan kuas; gambar berikut menunjukkan beberapa contoh:

Illustration of different brushes

Untuk informasi lebih lanjut, lihat Gambaran Umum kuas WPF.

Perenderan 3D

WPF juga mencakup kemampuan perenderan 3D yang terintegrasi dengan grafik 2D untuk memungkinkan pembuatan antarmuka pengguna yang lebih seru dan menarik. Misalnya, gambar berikut menunjukkan gambar 2D yang dirender ke bentuk 3D:

Visual3D sample screen shot

Untuk informasi lebih lanjut, lihat Gambaran Umum grafik 3D.

Animasi

Dukungan animasi WPF memungkinkan Anda membuat kontrol tumbuh, goyang, berputar, dan memudar, untuk membuat transisi halaman yang menarik, dan banyak lagi. Anda dapat menganimasikan sebagian besar kelas WPF, bahkan kelas kustom. Gambar berikut menunjukkan animasi sederhana yang sedang beraksi:

Images of an animated cube

Untuk informasi lebih lanjut, lihat Gambaran Umum animasi.

Media

Salah satu cara untuk menyampaikan konten kaya adalah melalui penggunaan media audiovisual. WPF menyediakan dukungan khusus untuk gambar, video, dan audio.

Gambar

Gambar umum untuk sebagian besar aplikasi, dan WPF menyediakan beberapa cara untuk menggunakannya. Gambar berikut menunjukkan antarmuka pengguna dengan kotak daftar yang berisi gambar mini. Saat gambar mini dipilih, gambar ditampilkan ukuran penuh.

Thumbnail images and a full-size image

Untuk informasi selengkapnya, lihat Gambaran umum pencitraan.

Video dan audio

Kontrol MediaElement ini mampu memutar video dan audio, dan cukup fleksibel untuk menjadi dasar pemutar media kustom. Markup XAML berikut mengimplementasikan pemutar media:

<MediaElement 
  Name="myMediaElement" 
  Source="media/wpf.wmv" 
  LoadedBehavior="Manual" 
  Width="350" Height="250" />

Jendela dalam gambar berikut menunjukkan kontrol dalam MediaElement tindakan:

A MediaElement control with audio and video

Untuk informasi selengkapnya, lihat Grafik dan multimedia.

Teks dan tipografi

Untuk memfasilitasi penyajian teks berkualitas tinggi, WPF menawarkan fitur-fitur berikut:

  • Dukungan font OpenType.

  • Penyempurnaan ClearType.

  • Performa tinggi yang memanfaatkan akselerasi perangkat keras.

  • Integrasi teks dengan media, grafik, dan animasi.

  • Dukungan font internasional dan mekanisme fallback.

Sebagai demonstrasi integrasi teks dengan grafik, gambar berikut menunjukkan penerapan dekorasi teks:

Text with various text decorations

Untuk informasi lebih lanjut, lihat Tipografi di Windows Presentation Foundation.

Menyesuaikan aplikasi WPF

Hingga saat ini, Anda telah melihat blok penyusun WPF inti untuk mengembangkan aplikasi. Anda menggunakan model aplikasi untuk menghosting dan mengirimkan konten aplikasi, yang sebagian besar terdiri dari kontrol. Untuk menyederhanakan pengaturan kontrol di antarmuka pengguna, dan untuk memastikan pengaturan dipertahankan dalam menghadapi perubahan pada ukuran jendela dan pengaturan tampilan, Anda menggunakan sistem tata letak WPF. Karena sebagian besar aplikasi memungkinkan pengguna berinteraksi dengan data, Anda menggunakan pengikatan data untuk mengurangi pekerjaan mengintegrasikan antarmuka pengguna Anda dengan data. Untuk meningkatkan tampilan visual aplikasi, Anda menggunakan rangkaian lengkap grafis, animasi, dan dukungan media yang disediakan oleh WPF.

Namun, seringkali, dasar-dasarnya tidak cukup untuk membuat dan mengelola pengalaman pengguna yang benar-benar berbeda dan menakjubkan secara visual. Kontrol WPF standar mungkin tidak terintegrasi dengan tampilan aplikasi Anda yang diinginkan. Data mungkin tidak ditampilkan dengan cara yang paling efektif. Pengalaman pengguna aplikasi Anda secara keseluruhan mungkin tidak sesuai dengan tampilan dan nuansa default tema Windows. Dalam banyak hal, teknologi presentasi membutuhkan ekstensibilitas visual sebanyak jenis ekstensibilitas lainnya.

Untuk alasan ini, WPF menyediakan berbagai mekanisme untuk menciptakan pengalaman pengguna yang unik, termasuk con yang kaya mode tenda l untuk kontrol, pemicu, templat kontrol dan data, gaya, sumber daya antarmuka pengguna, serta tema dan kulit.

Con mode tenda l

Tujuan utama sebagian besar kontrol WPF adalah untuk menampilkan konten. Di WPF, jenis dan jumlah item yang dapat membentuk konten kontrol disebut sebagai model konten kontrol. Beberapa kontrol dapat berisi satu item dan jenis konten; misalnya, konten dari adalah TextBox nilai string yang ditetapkan ke Text properti . Contoh berikut mengatur konten TextBoxdari :

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.TextBoxContentWindow"
    Title="TextBox Content">

    <TextBox Text="This is the content of a TextBox." />
</Window>

Gambar berikut menunjukkan hasilnya:

A TextBox control that contains text

Namun, kontrol lain dapat berisi beberapa item dari berbagai jenis konten; konten Button, yang ditentukan oleh Content properti , dapat berisi berbagai item termasuk kontrol tata letak, teks, gambar, dan bentuk. Contoh berikut menunjukkan Button dengan konten yang menyertakan DockPanel, , Labela Border, dan MediaElement:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.ButtonContentWindow"
    Title="Button Content">

  <Button Margin="20">
    <!-- Button Content -->
    <DockPanel Width="200" Height="180">
      <Label DockPanel.Dock="Top" HorizontalAlignment="Center">Click Me!</Label>
      <Border Background="Black" BorderBrush="Yellow" BorderThickness="2"
        CornerRadius="2" Margin="5">
        <MediaElement Source="media/wpf.wmv" Stretch="Fill" />
      </Border>
    </DockPanel>
  </Button>
</Window>

Gambar berikut menunjukkan konten tombol ini:

A button that contains multiple types of content

Untuk informasi lebih lanjut tentang jenis konten yang didukung oleh berbagai kontrol, lihat Model konten WPF.

Memicu

Meskipun tujuan utama markup XAML adalah untuk menerapkan tampilan aplikasi, Anda juga dapat menggunakan XAML untuk menerapkan beberapa aspek dari perilaku aplikasi. Salah satu contohnya adalah penggunaan pemicu untuk mengubah tampilan aplikasi berdasarkan interaksi pengguna. Untuk informasi lebih lanjut, lihat Gaya dan template.

Templat kontrol

Antarmuka pengguna default untuk kontrol WPF biasanya dibuat dari kontrol dan bentuk lain. Misalnya, Button terdiri dari kontrol ButtonChrome dan ContentPresenter. ButtonChrome memberikan tampilan tombol standar, sedangkan ContentPresenter menampilkan konten tombol, seperti yang ditentukan oleh properti Content.

Kadang-kadang tampilan default kontrol mungkin inkongruent dengan tampilan keseluruhan aplikasi. Dalam hal ini, Anda dapat menggunakan ControlTemplate untuk mengubah tampilan antarmuka pengguna kontrol tanpa mengubah konten dan perilakunya.

Contoh berikut menunjukkan cara mengubah tampilan a Button dengan menggunakan ControlTemplate:

<Window 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.ControlTemplateButtonWindow"
  Title="Button with Control Template" Height="158" Width="290">

  <!-- Button using an ellipse -->
  <Button Content="Click Me!" Click="button_Click">
    <Button.Template>
      <ControlTemplate TargetType="{x:Type Button}">
        <Grid Margin="5">
          <Ellipse Stroke="DarkBlue" StrokeThickness="2">
            <Ellipse.Fill>
              <RadialGradientBrush Center="0.3,0.2" RadiusX="0.5" RadiusY="0.5">
                <GradientStop Color="Azure" Offset="0.1" />
                <GradientStop Color="CornflowerBlue" Offset="1.1" />
              </RadialGradientBrush>
            </Ellipse.Fill>
          </Ellipse>
          <ContentPresenter Name="content" HorizontalAlignment="Center" 
            VerticalAlignment="Center"/>
        </Grid>
      </ControlTemplate>
    </Button.Template>

  </Button>

</Window>
using System.Windows; // Window, RoutedEventArgs, MessageBox

namespace SDKSample
{
    public partial class ControlTemplateButtonWindow : Window
    {
        public ControlTemplateButtonWindow()
        {
            InitializeComponent();
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            // Show message box when button is clicked
            MessageBox.Show("Hello, Windows Presentation Foundation!");
        }
    }
}
Imports System.Windows ' Window, RoutedEventArgs, MessageBox

Namespace SDKSample

    Public Class ControlTemplateButtonWindow
        Inherits Window

        Public Sub New()

            InitializeComponent()

        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            MessageBox.Show("Hello, Windows Presentation Foundation!")
        End Sub

    End Class

End Namespace

Dalam contoh ini, antarmuka pengguna tombol default telah diganti dengan yang Ellipse memiliki batas biru tua dan diisi menggunakan RadialGradientBrush. ContentPresenter Kontrol menampilkan konten Button, "Klik Saya!" Button Saat diklik, Click peristiwa masih dinaikkan sebagai bagian Button dari perilaku default kontrol. Hasilnya diperlihatkan dalam gambar berikut:

An elliptical button and a second window

Template data

Sementara template kontrol memungkinkan Anda menentukan tampilan kontrol, template data memungkinkan Anda menentukan tampilan konten kontrol. Template data sering digunakan untuk menyempurnakan cara data terikat ditampilkan. Gambar berikut menunjukkan tampilan default untuk ListBox yang terikat ke kumpulan objek Task, di mana setiap tugas memiliki nama, deskripsi, dan prioritas:

A list box with the default appearance

Tampilan default adalah apa yang Anda harapkan dari ListBox. Namun, tampilan default setiap tugas hanya berisi nama tugas. Untuk menampilkan nama tugas, deskripsi, dan prioritas, tampilan default item daftar terikat kontrol ListBox harus diubah dengan menggunakan DataTemplate. XAML berikut mendefinisikan seperti DataTemplate, yang diterapkan ke setiap tugas dengan menggunakan ItemTemplate atribut :

<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.DataTemplateWindow"
  Title="With a Data Template">
  <Window.Resources>
    <!-- Data Template (applied to each bound task item in the task collection) -->
    <DataTemplate x:Key="myTaskTemplate">
      <Border Name="border" BorderBrush="DarkSlateBlue" BorderThickness="2"
        CornerRadius="2" Padding="5" Margin="5">
        <Grid>
          <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
          </Grid.RowDefinitions>
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition />
          </Grid.ColumnDefinitions>
          <TextBlock Grid.Row="0" Grid.Column="0" Padding="0,0,5,0" Text="Task Name:"/>
          <TextBlock Grid.Row="0" Grid.Column="1" Text="{Binding Path=TaskName}"/>
          <TextBlock Grid.Row="1" Grid.Column="0" Padding="0,0,5,0" Text="Description:"/>
          <TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding Path=Description}"/>
          <TextBlock Grid.Row="2" Grid.Column="0" Padding="0,0,5,0" Text="Priority:"/>
          <TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding Path=Priority}"/>
        </Grid>
      </Border>
    </DataTemplate>
  </Window.Resources>

  <!-- UI -->
  <DockPanel>
    <!-- Title -->
    <Label DockPanel.Dock="Top" FontSize="18" Margin="5" Content="My Task List:"/>

    <!-- Data template is specified by the ItemTemplate attribute -->
    <ListBox
      ItemsSource="{Binding}"
      ItemTemplate="{StaticResource myTaskTemplate}"
      HorizontalContentAlignment="Stretch"
      IsSynchronizedWithCurrentItem="True"
      Margin="5,0,5,5" />

 </DockPanel>
</Window>

Gambar berikut menunjukkan efek kode ini:

List box that uses a data template

Perhatikan bahwa telah mempertahankan perilaku dan tampilan keseluruhannya; hanya tampilan konten yang ListBox ditampilkan oleh kotak daftar yang telah berubah.

Untuk informasi lebih lanjut, lihat Gambaran Umum template data.

Gaya

Gaya memungkinkan pengembang dan perancang membuat standar pada penampilan tertentu produk mereka. WPF menyediakan model gaya yang kuat, yang dasarnya adalah elemen Style. Contoh berikut membuat gaya yang mengatur warna latar belakang untuk setiap Button pada jendela menjadi Orange:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.StyleWindow"
    Title="Styles">
    
    <Window.Resources>
        <!-- Style that will be applied to all buttons for this window -->
        <Style TargetType="{x:Type Button}">
            <Setter Property="Background" Value="Orange" />
            <Setter Property="BorderBrush" Value="Crimson" />
            <Setter Property="FontSize" Value="20" />
            <Setter Property="FontWeight" Value="Bold" />
            <Setter Property="Margin" Value="5" />
        </Style>
    </Window.Resources>
    <StackPanel>

        <!-- This button will have the style applied to it -->
        <Button>Click Me!</Button>

        <!-- This label will not have the style applied to it -->
        <Label>Don't Click Me!</Label>

        <!-- This button will have the style applied to it -->
        <Button>Click Me!</Button>
        
    </StackPanel>
</Window>

Karena gaya ini menargetkan semua kontrol Button, gaya secara otomatis diterapkan ke semua tombol di jendela, seperti yang ditunjukkan pada gambar berikut:

Two orange buttons

Untuk informasi lebih lanjut, lihat Gaya dan template.

Sumber

Kontrol dalam aplikasi harus memiliki tampilan yang sama, yang dapat mencakup apa saja mulai dari font dan warna latar belakang hingga template kontrol, template data, dan gaya. Anda dapat menggunakan dukungan WPF untuk sumber daya antarmuka pengguna untuk merangkum sumber daya ini di satu lokasi untuk digunakan kembali.

Contoh berikut mendefinisikan warna latar belakang umum yang digunakan bersama oleh Button dan Label:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.ResourcesWindow"
    Title="Resources Window">

  <!-- Define window-scoped background color resource -->
  <Window.Resources>
    <SolidColorBrush x:Key="defaultBackground" Color="Red" />
  </Window.Resources>

  <!-- Button background is defined by window-scoped resource -->
  <Button Background="{StaticResource defaultBackground}">One Button</Button>

  <!-- Label background is defined by window-scoped resource -->
  <Label Background="{StaticResource defaultBackground}">One Label</Label>
</Window>

Contoh ini mengimplementasikan sumber daya warna latar belakang dengan menggunakan Window.Resources elemen properti. Sumber daya ini tersedia untuk semua anak dari Window. Ada berbagai cakupan sumber daya, termasuk yang berikut ini, tercantum dalam urutan penyelesaiannya:

  1. Kontrol individual (menggunakan properti yang diwariskan System.Windows.FrameworkElement.Resources ).

  2. A Window atau Page (juga menggunakan properti yang diwariskan System.Windows.FrameworkElement.Resources ).

  3. ( Application menggunakan System.Windows.Application.Resources properti ).

Berbagai cakupan memberi Anda fleksibilitas sehubungan dengan cara Anda menentukan dan berbagi sumber daya Anda.

Sebagai alternatif untuk mengaitkan sumber daya Anda secara langsung dengan cakupan tertentu, Anda dapat mengemas satu atau beberapa sumber daya dengan menggunakan terpisah ResourceDictionary yang dapat dirujuk di bagian lain aplikasi. Misalnya, contoh berikut menentukan warna latar belakang default dalam kamus sumber daya:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <!-- Define background color resource -->
  <SolidColorBrush x:Key="defaultBackground" Color="Red" />

  <!-- Define other resources -->
</ResourceDictionary>

Contoh berikut mereferensikan kamus sumber daya yang ditentukan dalam contoh sebelumnya sehingga dibagikan di seluruh aplikasi:

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App">

  <Application.Resources>
    <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="BackgroundColorResources.xaml"/>
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </Application.Resources>
</Application>

Sumber daya dan kamus sumber daya adalah fondasi dukungan WPF untuk tema dan kulit.

Untuk mengetahui informasi selengkapnya, lihat Sumber daya.

Kontrol kustom

Meskipun WPF menyediakan sejumlah dukungan kustomisasi, Anda mungkin menghadapi situasi di mana kontrol WPF yang ada tidak memenuhi kebutuhan aplikasi Anda atau penggunanya. Ini dapat terjadi ketika:

  • Antarmuka pengguna yang Anda butuhkan tidak dapat dibuat dengan menyesuaikan tampilan dan nuansa penerapan WPF yang ada.

  • Perilaku yang Anda butuhkan tidak didukung (atau tidak mudah didukung) oleh implementasi WPF yang ada.

Namun, pada titik ini, Anda dapat memanfaatkan salah satu dari tiga model WPF untuk membuat kontrol baru. Setiap model menargetkan skenario tertentu dan memerlukan kontrol khusus Anda untuk diturunkan dari kelas dasar WPF tertentu. Tiga model tersebut tercantum di sini:

  • Model Kontrol Pengguna. Kontrol kustom berasal dari UserControl dan terdiri dari satu atau beberapa kontrol lainnya.

  • Model Kontrol. Kontrol kustom berasal dari Control dan digunakan untuk membangun implementasi yang memisahkan perilaku mereka dari penampilan mereka menggunakan templat, sama seperti sebagian besar kontrol WPF. Berasal dari Control memberi Anda lebih banyak kebebasan untuk membuat antarmuka pengguna kustom daripada kontrol pengguna, tetapi mungkin memerlukan lebih banyak usaha.

  • Model Elemen Kerangka kerja. Kontrol kustom berasal dari FrameworkElement jika tampilannya ditentukan oleh logika perenderan kustom (bukan template).

Contoh berikut menunjukkan kontrol atas/bawah numerik kustom yang berasal dari UserControl:

<UserControl
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.NumericUpDown">

  <Grid>

    <Grid.RowDefinitions>
      <RowDefinition/>
      <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition/>
      <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <!-- Value text box -->
    <Border BorderThickness="1" BorderBrush="Gray" Margin="2" Grid.RowSpan="2" 
      VerticalAlignment="Center" HorizontalAlignment="Stretch">
      <TextBlock Name="valueText" Width="60" TextAlignment="Right" Padding="5"/>
    </Border>

    <!-- Up/Down buttons -->
    <RepeatButton Name="upButton" Click="upButton_Click" Grid.Column="1" 
      Grid.Row="0">Up</RepeatButton>
    <RepeatButton Name="downButton" Click="downButton_Click" Grid.Column="1" 
      Grid.Row="1">Down</RepeatButton>

  </Grid>

</UserControl>
using System; // EventArgs
using System.Windows; // DependencyObject, DependencyPropertyChangedEventArgs,
                      // FrameworkPropertyMetadata, PropertyChangedCallback,
                      // RoutedPropertyChangedEventArgs
using System.Windows.Controls; // UserControl

namespace SDKSample
{
    public partial class NumericUpDown : UserControl
    {
        // NumericUpDown user control implementation
    }
}
imports System 'EventArgs
imports System.Windows 'DependencyObject, DependencyPropertyChangedEventArgs, 
                       ' FrameworkPropertyMetadata, PropertyChangedCallback, 
                       ' RoutedPropertyChangedEventArgs
imports System.Windows.Controls 'UserControl

Namespace SDKSample

    ' Interaction logic for NumericUpDown.xaml
    Partial Public Class NumericUpDown
        Inherits System.Windows.Controls.UserControl

        'NumericUpDown user control implementation

    End Class

End Namespace

Contoh berikut mengilustrasikan XAML yang diperlukan untuk menggabungkan kontrol pengguna ke dalam Window:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.UserControlWindow"
    xmlns:local="clr-namespace:SDKSample" 
    Title="User Control Window">

  <!-- Numeric Up/Down user control -->
  <local:NumericUpDown />

</Window>

Gambar berikut menunjukkan kontrol yang NumericUpDown dihosting dalam Window:

A custom UserControl

Untuk informasi lebih lanjut tentang kontrol kustom, lihat Gambaran Umum pembuatan kontrol.

Praktik terbaik WPF

Seperti halnya platform pengembangan apa pun, WPF dapat digunakan dalam berbagai cara untuk mencapai hasil yang diinginkan. Sebagai cara untuk memastikan bahwa aplikasi WPF Anda memberikan pengalaman pengguna yang diperlukan dan memenuhi tuntutan audiens secara umum, ada praktik terbaik yang direkomendasikan untuk aksesibilitas, globalisasi dan pelokalan, dan performa. Untuk informasi selengkapnya, lihat:

Langkah berikutnya

Kami telah melihat fitur utama WPF. Sekarang saatnya untuk membangun aplikasi WPF pertama Anda.

Baca juga