Bagikan melalui


Cara: Mengganti Pohon Logis

Meskipun tidak diperlukan dalam kebanyakan kasus, penulis kontrol tingkat lanjut memiliki opsi untuk mengambil alih pohon logis.

Contoh

Contoh ini menjelaskan cara subkelas StackPanel untuk mengambil alih pohon logis, dalam hal ini untuk memberlakukan perilaku yang mungkin hanya dimiliki panel dan hanya akan merender satu elemen anak. Ini belum tentu merupakan perilaku yang praktis diinginkan, tetapi ditunjukkan di sini sebagai sarana untuk mengilustrasikan skenario untuk mengambil alih pohon logis normal elemen.

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

Untuk informasi selengkapnya tentang pohon logika, lihat Pohon di WPF.