Przegląd Moduły indeksowania układu

Moduły adoratorów są specjalnym typem FrameworkElement, używanym do dostarczania wskazówek wizualnych użytkownikowi. Między innymi moduły adoratorów mogą służyć do dodawania uchwytów funkcjonalnych do elementów lub dostarczania informacji o stanie kontrolki.

Informacje o modułach adoratorów

Element Adorner to niestandardowy obiekt FrameworkElement powiązany z elementem UIElement. Moduły adorujące są renderowane w AdornerLayerobiekcie , który jest powierzchnią renderowania, która jest zawsze na szczycie ozdobionego elementu lub kolekcji ozdobionych elementów. Renderowanie modułu adoratora jest niezależne od renderowania UIElement , do którego jest powiązany moduł adoratora. Moduł adorator jest zwykle umieszczony względem elementu, z którym jest powiązany, przy użyciu standardowego źródła współrzędnych 2D znajdującego się w lewym górnym rogu elementu ozdobionego.

Typowe aplikacje dla modułów adoratorów to:

  • Dodawanie uchwytów funkcjonalnych do elementu UIElement , które umożliwia użytkownikowi manipulowanie elementem w jakiś sposób (zmienianie rozmiaru, obracanie, zmienianie położenia itp.).
  • Prześlij opinię wizualną, aby wskazać różne stany lub w odpowiedzi na różne zdarzenia.
  • Nakładanie dekoracji wizualnych na obiekcie UIElement.
  • Wizualnie maskuj lub przesłoń część lub wszystkie elementy UIElement.

Program Windows Presentation Foundation (WPF) udostępnia podstawową strukturę do adorowania elementów wizualnych. W poniższej tabeli wymieniono typy podstawowe używane podczas adorowania obiektów i ich przeznaczenie. Poniżej przedstawiono kilka przykładów użycia:

Klasa opis
Adorner Abstrakcyjna klasa bazowa, z której dziedziczą wszystkie konkretne implementacje modułu adoratora.
AdornerLayer Klasa reprezentująca warstwę renderowania dla modułów adorujących co najmniej jeden element ozdobiony.
AdornerDecorator Klasa, która umożliwia skojarzenie warstwy adoratora z kolekcją elementów.

Implementowanie niestandardowego modułu adoratora

Struktura adorners zapewniana przez program Windows Presentation Foundation (WPF) ma na celu przede wszystkim obsługę tworzenia niestandardowych modułów adoratorów. Niestandardowy moduł adorator jest tworzony przez zaimplementowanie klasy dziedziczonej po klasie abstrakcyjnej Adorner .

Uwaga

Element nadrzędny elementu Adorner jest AdornerLayer elementem renderujący Adornerelement , a nie element, który jest ozdobiony.

W poniższym przykładzie przedstawiono klasę, która implementuje prosty moduł adoratora. Przykładowy adorator po prostu uwielbia rogi obiektu UIElement z okręgami.

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

Na poniższej ilustracji przedstawiono moduł SimpleCircleAdorner zastosowany do elementu TextBox:

Screenshot that shows an adorned text box.

Zachowanie renderowania dla modułów adoratorów

Należy pamiętać, że moduły adorujące nie zawierają żadnych nieodłącznych zachowań renderowania; zapewnienie, że moduł adoratora jest odpowiedzialny za implementator modułu adoratora. Typowym sposobem implementowania zachowania renderowania jest zastąpienie OnRender metody i użycie co najmniej jednego DrawingContext obiektu do renderowania wizualizacji modułu adoratora zgodnie z potrzebami (jak pokazano w powyższym przykładzie).

Uwaga

Wszystkie elementy umieszczone w warstwie modułu adoratora są renderowane na podstawie pozostałych ustawionych stylów. Innymi słowy, moduły adoratorów są zawsze wizualnie na górze i nie można ich zastąpić przy użyciu kolejności z.

Zdarzenia i testowanie trafień

Moduły adoratorów odbierają zdarzenia wejściowe tak samo jak każdy inny FrameworkElement. Ponieważ moduł adorator zawsze ma wyższą kolejność z niż element, który adoruje, moduł adorator odbiera zdarzenia wejściowe (takie jak Drop lub MouseMove), które mogą być przeznaczone dla bazowego elementu ozdobionego. Moduł adoratora może nasłuchiwać niektórych zdarzeń wejściowych i przekazywać je do bazowego elementu ozdobionego przez ponowne podniesienie zdarzenia.

Aby włączyć testowanie trafień przekazywanych elementów w ramach modułu adoratora, ustaw właściwość testu IsHitTestVisible trafienia na wartość false na adoratorze. Aby uzyskać więcej informacji na temat testowania trafień, zobacz Testowanie trafień w warstwie wizualnej.

Adorowanie pojedynczego elementu interfejsu użytkownika

Aby powiązać moduł adoratora z określonym UIElementelementem , wykonaj następujące kroki:

  1. Wywołaj metodę GetAdornerLayer statyczną AdornerLayer , aby uzyskać obiekt, UIElement który ma zostać ozdobiony. GetAdornerLayer Przechodzi w górę drzewa wizualnego, zaczynając od określonego UIElementelementu , i zwraca pierwszą warstwę modułu adoratora, która znajduje. (Jeśli nie znaleziono warstw modułu adoratora, metoda zwraca wartość null).

  2. Wywołaj metodę Add , aby powiązać moduł adoratora z obiektem docelowym UIElement.

Poniższy przykład wiąże element SimpleCircleAdorner (pokazany powyżej) z TextBox nazwą myTextBox:

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

Uwaga

Używanie języka XAML (Extensible Application Markup Language) w celu powiązania modułu adoratora z innym elementem nie jest obecnie obsługiwane.

Uwielbianie elementów podrzędnych panelu

Aby powiązać moduł adoratora z elementami podrzędnym obiektu Panel, wykonaj następujące kroki:

  1. Wywołaj metodę staticGetAdornerLayer , aby znaleźć warstwę modułu adoratora dla elementu, którego elementy podrzędne mają być ozdobione.

  2. Wyliczanie elementów podrzędnych elementu nadrzędnego i wywoływanie Add metody w celu powiązania modułu adoratora z każdym elementem podrzędnym.

Poniższy przykład wiąże element SimpleCircleAdorner (pokazany powyżej) z elementami podrzędnymi StackPanel o nazwie 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

Zobacz też