Aracılığıyla paylaş


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 örnek, panelin sadece tek bir alt öğeye sahip olmasına ve yalnızca bu alt öğeyi işlemeye zorlayan bir davranışı uygulamak için mantıksal ağacı değiştirmek amacıyla StackPanel üzerinde nasıl alt sınıf oluşturulacağını açıklar. 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. WPFAğaçları.