Compartir a través de


Cómo: Invalidar el árbol lógico

Actualización: noviembre 2007

Aunque no es necesario en la mayoría de los casos, los autores de controles avanzados tienen la opción de invalidar el árbol lógico.

Ejemplo

En este ejemplo se describe cómo crear subclases de StackPanel para invalidar el árbol lógico, en este caso se trata de exigir un comportamiento que sólo puede tener el panel y que únicamente representará un solo elemento secundario. No es un comportamiento necesariamente deseable desde el punto de vista práctico, pero se muestra aquí a fin de ilustrar el escenario de invalidación del árbol lógico normal de un elemento.

public class SingletonPanel : StackPanel
{
    //private UIElementCollection _children; 
    private FrameworkElement _child;

    public SingletonPanel() {

    }

    public FrameworkElement SingleChild
    {

        get { return _child;}
        set
        {
            if (value==null) {
                 RemoveLogicalChild(_child);
            } else {             
                 if (_child==null) {
                     _child = value;
                 } else {
                     // raise an exception?
                     MessageBox.Show("Needs to be a single element");
                 }
            }
        } 
    }
    public void SetSingleChild(object child)
    {
        this.AddLogicalChild(child);
    }

    public new void AddLogicalChild(object child)
    {
        _child = (FrameworkElement)child;
        if (this.Children.Count == 1)
        {
            this.RemoveLogicalChild(this.Children[0]);
            this.Children.Add((UIElement)child);
        }
        else
        {
            this.Children.Add((UIElement)child);
        }
    }

    public new void RemoveLogicalChild(object child)

    {
        _child = null;
        this.Children.Clear();
    }
    protected override IEnumerator LogicalChildren
    {
       get {
       // cheat, make a list with one member and return the enumerator
       ArrayList _list = new ArrayList();
       _list.Add(_child);
       return (IEnumerator) _list.GetEnumerator();}
    }
}

El ejemplo completo está disponible en Ejemplo Overriding the Logical Tree. Para obtener más información sobre el árbol lógico, vea Árboles en WPF.