Поделиться через


Как переопределить логическое дерево

Обновлен: Ноябрь 2007

Хотя это и не является необходимым в большинстве случаев, авторы дополнительных элементов управления могут переопределить логическое дерево.

Пример

В этом примере описано, как создать подкласс StackPanel, чтобы переопределить логическое дерево, в данном случае — изменяя поведение панели, которая будет отображать только один дочерний элемент. Это поведение не является необходимым на практике, но представлено здесь, чтобы показать сценарий для переопределения стандартного логического дерева элемента.

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

Полный пример содержится в разделе Пример переопределения логического дерева. Дополнительные сведения о логическом дереве содержатся в разделе Деревья в WPF.