Bagikan melalui


Gambaran Umum Adorner

Adorners adalah jenis FrameworkElementkhusus , digunakan untuk memberikan isjin visual kepada pengguna. Di antara kegunaan lain, Adorners dapat digunakan untuk menambahkan handel fungsional ke elemen atau memberikan informasi status tentang kontrol.

Tentang Adorners

Adorner adalah kustom FrameworkElement yang terikat ke UIElement. Adorners dirender dalam AdornerLayer, yang merupakan permukaan penyajian yang selalu berada di atas elemen menghiasi atau kumpulan elemen yang menghiasi. Penyajian seorang adorner bersifat independen dari penyajian UIElement yang diikat oleh seorang penjiwa. Pelikat biasanya diposisikan relatif terhadap elemen yang terikat, menggunakan asal koordinat 2D standar yang terletak di kiri atas elemen yang ditata.

Aplikasi umum untuk pelirik meliputi:

  • Menambahkan handel fungsional ke UIElement yang memungkinkan pengguna memanipulasi elemen dengan cara tertentu (mengubah ukuran, memutar, memposisikan ulang, dll.).
  • Berikan umpan balik visual untuk menunjukkan berbagai status, atau sebagai respons terhadap berbagai peristiwa.
  • Overlay dekorasi visual pada UIElement.
  • Secara visual menutupi atau mengambil alih bagian atau semua UIElement.

Windows Presentation Foundation (WPF) menyediakan kerangka kerja dasar untuk menghiasi elemen visual. Tabel berikut mencantumkan jenis utama yang digunakan saat menghiasi objek, dan tujuannya. Beberapa contoh penggunaan berikut:

Kelas Deskripsi
Adorner Kelas dasar abstrak tempat semua implementasi penggila konkret mewarisi.
AdornerLayer Kelas yang mewakili lapisan penyajian untuk pujaan dari satu atau beberapa elemen yang menghiasi.
AdornerDecorator Kelas yang memungkinkan lapisan adorner dikaitkan dengan kumpulan elemen.

Menerapkan Adorner Kustom

Kerangka kerja adorners yang disediakan oleh Windows Presentation Foundation (WPF) ditujukan terutama untuk mendukung pembuatan pelawak kustom. Pelikat kustom dibuat dengan menerapkan kelas yang mewarisi dari kelas abstrak Adorner .

Catatan

Induk dari adalah AdornerAdornerLayer yang merender Adorner, bukan elemen yang menghiasi.

Contoh berikut menunjukkan kelas yang mengimplementasikan pujaan sederhana. Contoh pujaan hanya menghiasi sudut-sudut dengan UIElement lingkaran.

// Adorners must subclass the abstract base class Adorner.
public class SimpleCircleAdorner : Adorner
{
  // Be sure to call the base class constructor.
  public SimpleCircleAdorner(UIElement adornedElement)
    : base(adornedElement)
  {
  }

  // A common way to implement an adorner's rendering behavior is to override the OnRender
  // method, which is called by the layout system as part of a rendering pass.
  protected override void OnRender(DrawingContext drawingContext)
  {
    Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);

    // Some arbitrary drawing implements.
    SolidColorBrush renderBrush = new SolidColorBrush(Colors.Green);
    renderBrush.Opacity = 0.2;
    Pen renderPen = new Pen(new SolidColorBrush(Colors.Navy), 1.5);
    double renderRadius = 5.0;

    // Draw a circle at each corner.
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
    drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius);
  }
}
Public Class SimpleCircleAdorner
    Inherits Adorner
    Sub New(ByVal adornedElement As UIElement)
        MyBase.New(adornedElement)
    End Sub

    Protected Overrides Sub OnRender(ByVal drawingContext As System.Windows.Media.DrawingContext)
        MyBase.OnRender(drawingContext)
        Dim adornedElementRect As New Rect(AdornedElement.DesiredSize)
        Dim renderBrush As New SolidColorBrush(Colors.Green)
        renderBrush.Opacity = 0.2
        Dim renderPen As New Pen(New SolidColorBrush(Colors.Navy), 1.5)
        Dim renderRadius As Double
        renderRadius = 5.0

        'Draw a circle at each corner.
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius)
        drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius)
    End Sub
End Class

Gambar berikut menunjukkan SimpleCircleAdorner yang diterapkan ke TextBox:

Screenshot that shows an adorned text box.

Perilaku Rendering untuk Adorners

Penting untuk dicatat bahwa pemberi pujaan tidak menyertakan perilaku penyajian yang melekat; memastikan bahwa adorner render adalah tanggung jawab pelaksana yang menggemaskan. Cara umum untuk menerapkan perilaku penyajian adalah dengan mengambil alih OnRender metode dan menggunakan satu atau beberapa DrawingContext objek untuk merender visual adorner sesuai kebutuhan (seperti yang ditunjukkan pada contoh di atas).

Catatan

Apa pun yang ditempatkan di lapisan adorner dirender di atas gaya apa pun yang telah Anda tetapkan. Dengan kata lain, pelawak selalu secara visual berada di atas dan tidak dapat ditimpa menggunakan z-order.

Peristiwa dan Pengujian Hit

Adorners menerima peristiwa input sama seperti yang lain FrameworkElement. Karena seorang penata selalu memiliki urutan z yang lebih tinggi daripada elemen yang menghiasinya, pelihara menerima peristiwa input (seperti Drop atau MouseMove) yang mungkin ditujukan untuk elemen yang menghiasi yang mendasar. Seorang adorner dapat mendengarkan peristiwa input tertentu dan meneruskan ini ke elemen yang menghiasi yang mendasar dengan menaikkan kembali peristiwa.

Untuk mengaktifkan pengujian temuan pass-through elemen di bawah adorner, atur properti uji IsHitTestVisible hit ke false pada adorner. Untuk informasi selengkapnya tentang pengujian hit, lihat Pengujian Hit di Lapisan Visual.

Menghiasi UIElement Tunggal

Untuk mengikat pujaan untuk tertentu UIElement, ikuti langkah-langkah berikut:

  1. Panggil metode GetAdornerLayer statis untuk mendapatkan AdornerLayer objek untuk UIElement menghiasi. GetAdornerLayer berjalan di atas pohon visual, dimulai dari UIElement, dan mengembalikan lapisan adorner pertama yang ditemukannya. (Jika tidak ada lapisan adorner yang ditemukan, metode mengembalikan null.)

  2. Add Panggil metode untuk mengikat pengikat ke target UIElement.

Contoh berikut mengikat SimpleCircleAdorner (ditunjukkan di atas) ke TextBox myTextBox bernama:

myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox);
myAdornerLayer.Add(new SimpleCircleAdorner(myTextBox));
myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox)
myAdornerLayer.Add(New SimpleCircleAdorner(myTextBox))

Catatan

Menggunakan Extensible Application Markup Language (XAML) untuk mengikat adorner ke elemen lain saat ini tidak didukung.

Menghiasi Anak-Anak Panel

Untuk mengikat pujaan kepada anak-anak Panel, ikuti langkah-langkah berikut:

  1. static Panggil metode GetAdornerLayer untuk menemukan lapisan yang menggemaskan untuk elemen yang anak-anaknya akan ditata.

  2. Hitung melalui turunan elemen induk dan panggil Add metode untuk mengikat pengikat ke setiap elemen turunan.

Contoh berikut mengikat SimpleCircleAdorner (ditunjukkan di atas) ke anak-anak StackPanel bernama myStackPanel:

foreach (UIElement toAdorn in myStackPanel.Children)
  myAdornerLayer.Add(new SimpleCircleAdorner(toAdorn));
For Each toAdorn As UIElement In myStackPanel.Children
    myAdornerLayer.Add(New SimpleCircleAdorner(toAdorn))
Next

Baca juga