2010-04-16 3 views
9

Sto provando ad aggiungere un effetto di sovrapposizione al mio UserControl e so che sono gli ornamenti usati in WPF. Ma sono un po 'confuso su come dovrebbero funzionare. Ho capito che il layer di adorner è implicitamente gestito dal runtime di WPF e, in quanto tale, dovrebbe essere sempre disponibile.Quando viene reso disponibile per la prima volta un layer per decoratore WPF?

Ma quando creo un'istanza del mio UserControl nel codice, non vi è alcun livello di adornatore. Il seguente codice non riesce con eccezione:

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."); 
} 

Qualcuno può spiegarmi come funziona? Devo prima posizionare l'istanza UserControl in una finestra di primo livello? O devo in qualche modo definire il livello in qualche modo? Scavare nella documentazione non mi ha portato da nessuna parte.

Grazie!

risposta

16

Il AdornerLayer viene generato da entrambe le classi AdornerDecorator e ScrollContentPresenter. Se non c'è nessuna di queste classi nell'albero visuale che i genitori controllano, allora non avrà uno AdornerLayer associato.

Si potrebbe aggiungere un AdornerDecorator al vostro UserControl, ma che farà in modo che la vostra Adorners sono solo sulla cima di controlli che sono discendenti del UserControl.

L'impostazione predefinita ControlTemplate per la finestra include un AdornerDecorator, quindi se si aggiunge il UserControl a una finestra, allora dovrebbe ottenere il AdornerLayer.

0

Tutto dipende da dove si chiama il codice e dove risiede il controllo. Nel caso che hai fornito, il controllo non è stato ancora istanziato tramite il metodo InitializeComponent(). Dovrai effettivamente posizionare il controllo da qualche parte in una delle tue visualizzazioni o semplicemente averlo dichiarato in XAML prima del tempo per essere in grado di estrarre il AdornerLayer.