Donatıcılara Genel Bakış
Donatıcılar FrameworkElement , bir kullanıcıya görsel ipuçları sağlamak için kullanılan özel bir türüdür. Diğer kullanımlar arasında, Donatıcılar, öğelere işlevsel işleyiciler eklemek veya bir denetimle ilgili durum bilgilerini sağlamak için kullanılabilir.
Donatıcılar hakkında
Adorner, FrameworkElement Bir öğesine bağlanan özel bir UIElement . Donatıcılar AdornerLayer , her zaman donatılan veya donatılan bir öğe koleksiyonu olan bir işleme yüzeyi olan bir üzerinde işlenir. Donatıcının işlenmesi, donatıcının bağlandığı öğenin işlenmesinin bağımsızdır UIElement . Bir donatıcı genellikle, ilişkili olduğu öğeye göre konumlandırılır ve donatılan öğenin sol üst kısmında bulunan standart 2B koordinat başlangıcını kullanarak konumlandırılır.
Donatıcılar için ortak uygulamalar şunlardır:
- Bir UIElement kullanıcının öğeyi bir şekilde (yeniden boyutlandırma, döndürme, yeniden konumlandırma, vb.) işlemesini sağlayan bir öğesine işlevsel işleyiciler ekleme.
- Çeşitli durumları veya çeşitli olaylara yanıt olarak göstermek için görsel geri bildirim sağlayın.
- Görsel süslemeleri bir üzerinde kaplama UIElement .
- Bir kısmını veya tümünü görsel olarak maskesini veya geçersiz kılın UIElement .
Windows Presentation Foundation (WPF) görsel öğeleri donatma için temel bir çerçeve sağlar. Aşağıdaki tabloda, nesneleri donatma ve amaçlarına göre kullanılan birincil türler listelenmektedir. Birçok kullanım örneği aşağıda verilmiştir:
| Adorner | Tüm somut donatıcı uygulamalarının devraldığı soyut temel sınıf. |
| AdornerLayer | Bir veya daha fazla donatılan öğenin donatıcı için işleme katmanını temsil eden bir sınıf. |
| AdornerDecorator | Bir donatıcı katmanının bir öğe koleksiyonuyla ilişkilendirilmesini sağlayan bir sınıf. |
Özel Donatıcı Uygulama
Windows Presentation Foundation (WPF) tarafından sunulan donatıcılar çerçevesi öncelikle özel donatıcıları oluşturmayı desteklemek üzere tasarlanmıştır. Özel bir donatıcı, soyut sınıftan devralan bir sınıf uygulayarak oluşturulur Adorner .
Not
Öğesinin üst öğesi, AdornerAdornerLayerAdorner donatılan öğeyi değil öğesini işleyen öğesidir.
Aşağıdaki örnek, basit bir donatıcı uygulayan bir sınıfı gösterir. Örnek donatıcı, bir çemberin köşelerini bir daire içinde donatır UIElement .
// 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, öğesine uygulanan SimpleCircleAdorner gösterilmektedir TextBox :

Donatıcılar için işleme davranışı
Donatıcıların herhangi bir devralınan işleme davranışı içermediğinden emin olmak önemlidir; bir donatıcının işleme, donatıcı uygulayıcının sorumluluğunda olmasını sağlamaktır. İşleme davranışını uygulamanın yaygın bir yolu, yöntemi geçersiz kılmak OnRender ve bir veya daha fazla DrawingContext nesneyi, donatıcının gerektiğinde (Yukarıdaki örnekte gösterildiği gibi) işlemek için bir veya daha fazla nesne kullanmaktır.
Not
Donatıcı katmanına yerleştirilmiş herhangi bir şey, ayarlamış olduğunuz stillerin en üstünde işlenir. Diğer bir deyişle, Donatıcılar her zaman görsel olarak açıktır ve z sırası kullanılarak geçersiz kılınamaz.
Olaylar ve Isabet testi
Donatıcılar, tıpkı diğer gibi giriş olayları alır FrameworkElement . Bir donatıcı her zaman, donatıladığı öğeden daha yüksek bir z düzeninde olduğundan, donatıcı, DropMouseMove temel alınan donatılan öğeye yönelik olarak giriş olayları (veya gibi) alır. Bir donatıcı, belirli giriş olaylarını dinleyebilir ve olayı yeniden oluşturarak bunları temel donatılan öğeye geçirebilir.
Bir donatıcı kapsamındaki öğelerin doğrudan isabet sınamasını etkinleştirmek için, IsHitTestVisible donatıcı üzerinde isabet testi özelliğini IsHitTestVisible olarak ayarlayın. İsabet testi hakkında daha fazla bilgi için bkz. görsel katmandaki Isabet testi.
Tek bir UIElement 'i donatma
Bir donatıcıyı belirli bir nesneye bağlamak için UIElement şu adımları izleyin:
' Nin GetAdornerLayer donatılacak bir nesne almak için static yöntemi çağırın AdornerLayerUIElement . GetAdornerLayer görsel ağacı, belirtilen ' dan başlayarak UIElement ve bulduğu ilk donatıcı katmanını döndürür. (Bir donatıcı katmanı bulunmazsa, yöntem null döndürür.)
AddDonatıcıyı hedefe bağlamak için yöntemini çağırın UIElement .
Aşağıdaki örnek bir SimpleCircleAdorner 'ı (yukarıda gösterilen) TextBox adlandırılmış bir TextBox'a bağlar:
myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox);
myAdornerLayer.Add(new SimpleCircleAdorner(myTextBox));
myAdornerLayer = AdornerLayer.GetAdornerLayer(myTextBox)
myAdornerLayer.Add(New SimpleCircleAdorner(myTextBox))
Not
Bir donatıcıyı başka bir öğeye bağlamak için Extensible Application Markup Language (XAML) kullanımı Şu anda desteklenmiyor.
Panelin alt öğelerini donatma
Bir donatıcıyı a 'nın alt öğelerine bağlamak için Panel şu adımları izleyin:
staticGetAdornerLayer Alt öğeleri donatılacak olan öğe için bir donatıcı katmanı bulmak için yöntemini çağırın.Üst öğenin alt öğelerini numaralandırın ve Add her bir alt öğeye bir donatıcı bağlamak için yöntemini çağırın.
Aşağıdaki örnek bir SimpleCircleAdorner (yukarıda gösterilen) StackPanel adlı bir StackPanelalt öğesine 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