2010-04-16 8 views
9

Ich versuche, einen Overlay-Effekt zu meinem UserControl hinzuzufügen, und ich weiß, dass Adorner in WPF verwendet werden. Aber ich bin ein wenig verwirrt darüber, wie sie angeblich arbeiten. Ich dachte mir, dass der Adorner-Layer implizit von der WPF-Runtime gehandhabt wird und daher immer verfügbar sein sollte.Wann wird zuerst eine WPF-Adorner-Ebene verfügbar?

Wenn ich jedoch eine Instanz von UserControl im Code erstelle, gibt es dort keine Adorner-Ebene. Der folgende Code schlägt mit Ausnahme fehl:

var view = new MyUserControl(); 
var target = view.GetAdornerTarget(); // This returns a specific UI control. 
var layer = AdornerLayer.GetAdornerLayer(target); 
if (layer == null) 
{ 
    throw new Exception("No adorner layer at the moment."); 
} 

Kann mir bitte jemand erklären, wie das funktionieren soll? Muss ich die UserControl-Instanz zuerst in ein Top-Level-Fenster platzieren? Oder muss ich die Ebene selbst irgendwie definieren? Durch die Dokumentation zu graben hat mich nirgendwohin geführt.

Vielen Dank!

Antwort

16

Die AdornerLayer wird von den beiden Klassen AdornerDecorator und ScrollContentPresenter generiert. Wenn es keine der Klassen in der visuellen Struktur gibt, die die Eltern steuern, wird kein AdornerLayer zugeordnet.

Sie könnten eine AdornerDecorator zu Ihrem UserControl, fügen aber das wird sicherstellen, dass Ihre Adorners nur auf der Kontrollen sind die Nachkommen der UserControl sind.

Der Standard ControlTemplate für das Fenster enthält ein AdornerDecorator, wenn Sie also die UserControl zu einem Fenster hinzufügen, dann sollte es die AdornerLayer bekommen.

0

Es hängt alles davon ab, wo Sie den Code aufrufen und wo sich das Steuerelement befindet. In dem von Ihnen bereitgestellten Fall wurde das Steuerelement noch nicht über die InitializeComponent() -Methode instanziiert. Sie müssen das Steuerelement tatsächlich irgendwo in einer Ihrer Ansichten platzieren oder es einfach vorher in XAML deklarieren lassen, um den AdornerLayer ziehen zu können.