Megosztás a következőn keresztül:


Útmutató: A logikai fa felülírása

Bár a legtöbb esetben nem szükséges, a speciális vezérlőknek lehetőségük van felülbírálni a logikai fát.

példa

Ez a példa bemutatja, hogyan lehet alosztályozni a(z) StackPanel-t a logikai fa felülbírálásához, hogy ebben az esetben egy olyan viselkedést kényszerítsünk ki, amely szerint a panel csakis egyetlen gyermekelemet tartalmazhat és jeleníthet meg. Ez nem feltétlenül egy gyakorlatilag kívánatos viselkedés, de itt az elem normál logikai fájának felülbírálására szolgáló forgatókönyv szemléltetésének eszközeként jelenik meg.

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

További információ a logikai fáról az alábbi hivatkozásnál található: Fák a WPF.