2010-06-14 19 views
10

Sono stato utilizzando lo stesso pezzo di codice per diverse versioni di mia app senza problemi, ma ora sto ricevendo misteriosamente NullRerefenceException s con il seguente:GetAdornerLayer misteriosamente ritorno nullo

this.Loaded += delegate { 
    deleteBrush = new DeleteBrushAdorner(background); 
    AdornerLayer al = AdornerLayer.GetAdornerLayer(background); 
    al.Add(deleteBrush); // null ref here?? 
}; 

background è solo un elemento Border.

I miei due pensieri su cosa potrebbe causarlo sono a) passaggio a .NET 4.0 eb) collocazione di istanze dell'elemento precedente (che è un) in un ItemsControl.

Stranamente questo non accade sempre, ed è difficile prevedere quando accadrà, quindi non è affidabile.

risposta

8

la documentazione per AdornerLayer.GetAdornerLayer specificano:

Se non si trovano strati Adorner, il metodo restituisce null.

Quindi la mia ipotesi è che non ci sono strati di ornamenti ... avete qualche ragione per credere che questo non dovrebbe essere il caso? Che garanzia ti stai facendo affidamento sul fatto che ci sarà un layer di adorner nell'albero visivo?

+2

La stessa cosa si verifica se si utilizza un 'AdornerDecorator' invece di un' Border', anche se ora vedo in base a MSDN che "fornisce un livello di strumento decorativo per gli elementi * * sotto di essa nella struttura ad albero visuale." Lasciami provare a racchiudere il bordo in un AdornerLayer ... – devios1

+0

Fin qui tutto bene, in realtà. Ci scusiamo per la domanda stupida: $ – devios1

3

Sono curioso di sapere se questo è stato davvero risolto. Un AdornerDecorator fornisce un AdornerLayer per l'elemento sottostante - e tutto sarà al di sotto di esso. È un decoratore, nel senso che ha un figlio che è il contenuto. Quel contenuto è stato fornito con un AdornerLayer. Quindi, se metti un AdornerDecorator nel tuo XAML e il figlio è il bordo, il bordo ha un AdornerLayer.

Inoltre, Finestra definisce un AdornerDecorator come la parte superiore dell'albero visivo in modo che qualsiasi elemento in una Finestra abbia un AdornerLayer sopra di esso. Quindi, se il tuo con sopra era in una finestra ...

+2

La soluzione che ha finito per funzionare era di mettere un 'AdornerDecorator' * sopra * (cioè come genitore di) il' Border' nell'albero visivo. Era davvero in una finestra, anche se non cromata, ma forse questo è un problema con .NET 4 perché ha funzionato bene senza avere il 'AdornerDecorator' in .NET 3.5. – devios1

+0

Ho avuto lo stesso problema. Stavo cercando di adornare i controlli che si trovavano all'interno di una finestra, ma GetAdornerLayer ha restituito null, indipendentemente da cosa stavo cercando di ottenere il layer adorner. – kubal5003

9

So che questa è una domanda vecchia ma oggi ho riscontrato questo problema.

Nel mio caso ho avuto una classe basata su Window e GetAdornerLayer() restituita nulla. Si è scoperto che il ControlTemplate per la mia classe derivata non conteneva lo AdornerDecorator. Aggiungendo questo come il livello superiore nel ControlTemplate risolto il problema.

<Style TargetType="my:MyWindow" BasedOn="{StaticResource {x:Type Window}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="my:MyWindow"> 
       <AdornerDecorator> 
       <DockPanel ...> 
       </DockPanel> 
       </AdornerDecorator> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style>