Condividi tramite


Procedura: Eseguire l'override dell'albero logico

Anche se nella maggior parte dei casi non è necessario, gli autori di controlli avanzati hanno la possibilità di eseguire l'override dell'albero logico.

Esempio

In questo esempio viene illustrato come eseguire il sottoclassing di StackPanel per eseguire l'override dell'albero logico, al fine di applicare un comportamento per cui il pannello possa avere e renderizzare solo un singolo elemento figlio. Questo non è necessariamente un comportamento praticamente auspicabile, ma viene illustrato qui come mezzo per illustrare lo scenario per eseguire l'override dell'albero logico normale di 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();
        }
    }
}

Per altre informazioni sull'albero logico, vedere Trees in WPF.