Aracılığıyla paylaş


Donatıcılara Genel Bakış

Donatıcılar, kullanıcıya görsel ipuçları sağlamak için kullanılan özel bir türüdür FrameworkElement. Diğer kullanımlar arasında, Donatıcılar öğelere işlevsel tanıtıcılar eklemek veya bir denetim hakkında durum bilgisi sağlamak için kullanılabilir.

Donatıcılar Hakkında

, Adorner öğesine bağlı olan bir UIElementözel FrameworkElement öğedir. Donatıcılar, her zaman süslenmiş öğenin veya süslenmiş öğeler koleksiyonunun üzerinde yer alan bir işleme yüzeyi olan içinde işlenir AdornerLayer. Bir donatıcının işlenmesi, donatıcının UIElement bağlı olduğu işlemeden bağımsızdır. Donatıcı genellikle, donatılan öğenin sol üst kısmında bulunan standart 2B koordinat kaynağı kullanılarak bağlandığı öğeye göre konumlandırılır.

Donatıcılar için yaygın uygulamalar şunlardır:

  • kullanıcının öğeyi bir UIElement şekilde işlemesini sağlayan işlevsel tanıtıcılar ekleme (yeniden boyutlandırma, döndürme, yeniden konumlandırma vb.).
  • Çeşitli durumları belirtmek için veya çeşitli olaylara yanıt olarak görsel geri bildirim sağlayın.
  • Görsel süslemeleri bir UIElementüzerine katmanla.
  • bir bölümünü veya tamamını UIElementgörsel olarak maskele veya geçersiz kıl.

Windows Presentation Foundation (WPF), görsel öğeleri donatma için temel bir çerçeve sağlar. Aşağıdaki tabloda nesneleri süslerken kullanılan birincil türler ve bunların amacı listelenmiştir. Birkaç kullanım örneği aşağıda verilmiştir:

Sınıf Tanım
Adorner Tüm somut donatıcı uygulamalarının devraldığı soyut bir temel sınıf.
AdornerLayer Bir veya daha fazla süslü öğeden oluşan donatıcılar için işleme katmanını temsil eden sınıf.
AdornerDecorator Bir donatıcı katmanının bir öğe koleksiyonuyla ilişkilendirilmesine olanak tanıyan bir sınıf.

Özel Donatıcı Uygulama

Windows Presentation Foundation (WPF) tarafından sağlanan donatıcılar çerçevesi öncelikli olarak özel donatıcıların oluşturulmasını desteklemeye yöneliktir. Özel donatıcı, soyut Adorner sınıftan devralan bir sınıf uygulanarak oluşturulur.

Dekont

öğesinin Adorner üst öğesi, süslenen öğeyi değil, öğesini işleyen AdorneröğedirAdornerLayer.

Aşağıdaki örnekte basit bir donatıcı uygulayan bir sınıf gösterilmektedir. Örnek donatıcı, bir öğesinin köşelerini UIElement dairelerle donatır.

// 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

Aşağıdaki görüntüde, bir 'a uygulanan SimpleCircleAdorner gösterilmektedir TextBox:

Screenshot that shows an adorned text box.

Donatıcılar için İşleme Davranışı

Donatıcıların herhangi bir doğal işleme davranışı içermediğini unutmayın; bir donatıcının işlemesini sağlamak, donatıcı uygulayıcısının sorumluluğundadır. İşleme davranışını uygulamanın yaygın bir yolu, yöntemini geçersiz kılmak OnRender ve gerektiğinde donatıcının görsellerini işlemek için bir veya daha fazla DrawingContext nesne kullanmaktır (yukarıdaki örnekte gösterildiği gibi).

Dekont

Donatıcı katmanına yerleştirilen her şey, ayarladığınız diğer stillerin üzerinde işlenir. Başka bir deyişle, donatıcılar her zaman görsel olarak üsttedir ve z-order kullanılarak geçersiz kılınamaz.

Olaylar ve İsabet Testi

Donatıcılar giriş olaylarını diğer FrameworkElementtüm gibi alır. Donatıcı her zaman donattığı öğeden daha yüksek bir z sırasına sahip olduğundan, donatıcı temel alınan öğeye yönelik olabilecek giriş olaylarını (veya MouseMovegibiDrop) alır. Donatıcı belirli giriş olaylarını dinleyebilir ve olayı yeniden oluşturarak bunları temel alınan süslenmiş öğeye geçirebilir.

Bir donatıcı altındaki öğelerin doğrudan isabet testini etkinleştirmek için, isabet testi IsHitTestVisible özelliğini donatıcıda false olarak ayarlayın. İsabet testi hakkında daha fazla bilgi için bkz . Görsel Katmanında İsabet Testi.

Tek BIR UIElement'i Donatma

Bir donatıcıyı belirli UIElementbir öğesine bağlamak için şu adımları izleyin:

  1. öğesinin donatılması için bir AdornerLayer nesne almak için UIElement statik yöntemini GetAdornerLayer çağırın. GetAdornerLayer belirtilen UIElementkonumundan başlayarak görsel ağaçta ilerler ve bulduğu ilk donatıcı katmanını döndürür. (Hiçbir donatıcı katmanı bulunmazsa, yöntem null döndürür.)

  2. Donatıcıyı Add hedefe UIElementbağlamak için yöntemini çağırın.

Aşağıdaki örnek, simpleCircleAdorner'ı (yukarıda gösterilen) adlandırılmış myTextBox'a TextBoxbağlar:

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

Dekont

Bir donatıcıyı başka bir öğeye bağlamak için Genişletilebilir Uygulama İşaretlemesi Dili 'nin (XAML) kullanılması şu anda desteklenmiyor.

Panelin Alt Öğelerini Süsleme

Bir donatıcıyı alt öğelerine Panelbağlamak için şu adımları izleyin:

  1. static Alt öğeleri donatılacak öğe için bir donatıcı katmanı bulmak için yöntemini GetAdornerLayer çağırın.

  2. Üst öğenin alt öğelerini numaralandırın ve her alt öğeye bir donatıcı bağlamak için yöntemini çağırın Add .

Aşağıdaki örnek, bir SimpleCircleAdorner'ı (yukarıda gösterilmiştir) myStackPanel adlı bir StackPanel çocuğun alt öğelerine bağlar:

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

Ayrıca bkz.