2010-06-14 16 views
10

He estado usando el mismo bit de código para varias versiones de mi aplicación sin problemas, pero ahora estoy misteriosamente recibir NullRerefenceException s con lo siguiente:GetAdornerLayer misteriosamente volver nula

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

background es sólo un elemento Border.

Mis dos pensamientos sobre lo que podría estar causando esto son a) cambiar a .NET 4.0, yb) colocar instancias del elemento anterior (que es UserControl) en un ItemsControl.

Curiosamente, esto no sucede todo el tiempo, y es difícil predecir cuándo sucederá, por lo que no es confiable.

Respuesta

8

la documentación para AdornerLayer.GetAdornerLayer especifican:

Si no se encuentran capas Adorner, el método devuelve null.

Así que mi suposición es que no hay capas de adorno ... ¿tiene alguna razón para creer que este no debería ser el caso? ¿En qué garantía confía actualmente en que habrá una capa adorner en el árbol visual?

+2

Lo mismo ocurre si uso un 'AdornerDecorator' en lugar de un' Border', aunque ahora veo acuerdo con MSDN que "proporciona una capa de elementos adorner * * por debajo de ella en el árbol visual." Déjame intentar envolver el borde en AdornerLayer ... – devios1

+0

Hasta ahora todo bien, en realidad. Perdón por la pregunta tonta: $ – devios1

3

Tengo curiosidad por saber si esto realmente se resolvió. Un AdornerDecorator proporciona un AdornerLayer para el elemento debajo de él, y todo estará debajo de él. Es un decorador, lo que significa que tiene un Niño que es el contenido. Ese contenido está siendo provisto con AdornerLayer. Entonces, si coloca un AdornerDecorator en su XAML y el niño es el borde, el borde tiene un AdornerLayer.

Además, Window define AdornerDecorator como la parte superior del árbol visual para que cualquier elemento en una ventana tenga una AdornerLayer encima. Por lo tanto, si su opinión anterior estaba en una ventana ...

+2

La solución que terminó funcionando fue simplemente poner un 'AdornerDecorator' * arriba * (es decir, como padre de) el' Border' en el árbol visual. De hecho, estaba en una ventana, aunque sin brillo, pero tal vez este es un problema con .NET 4 porque funcionó bien sin tener el 'AdornerDecorator' en .NET 3.5. – devios1

+0

Tuve el mismo problema. Intenté adornar los controles que estaban dentro de una ventana, pero GetAdornerLayer devolvió nulo, sin importar para qué estaba tratando de obtener la capa de adorno. – kubal5003

9

Sé que esta es una vieja pregunta, pero tuve este problema hoy.

En mi caso tuve una clase que se basa en Window y GetAdornerLayer() devuelto nulo. Resultó que el ControlTemplate para mi clase derivada no contenía el AdornerDecorator. Agregar eso como el nivel superior en el ControlTemplate resolvió el 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>