Nasıl yapılır: Mantıksal Ağacı Geçersiz Kılma

Çoğu durumda gerekli olmasa da, gelişmiş denetim yazarlarının mantıksal ağacı geçersiz kılma seçeneği vardır.

Örnek

Bu örnekte, panelin yalnızca sahip olabileceği ve yalnızca tek bir alt öğe işleyebileceği bir davranışı zorlamak için mantıksal ağacı geçersiz kılmak için alt sınıfın StackPanel nasıl oluşturulacağı açıklanır. Bu, pratikte istenen bir davranış olmayabilir, ancak burada bir öğenin normal mantıksal ağacını geçersiz kılma senaryoyu göstermenin bir yolu olarak gösterilir.

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();
        }
    }
}

Mantıksal ağaç hakkında daha fazla bilgi için bkz . WPF'deki Ağaçlar.