Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Aunque no es necesario en la mayoría de los casos, los autores de controles avanzados tienen la opción de invalidar el árbol lógico.
Ejemplo
En este ejemplo se describe cómo crear una subclase de StackPanel para sobrescribir el árbol lógico, en este caso, para imponer un comportamiento donde el panel solo pueda tener y solo renderizará un único elemento hijo. Esto no es necesariamente un comportamiento prácticamente deseable, pero se muestra aquí como medio de ilustrar el escenario para invalidar el árbol lógico normal de un elemento.
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();
}
}
}
Para obtener más información sobre el árbol lógico, vea Árboles en WPF.
.NET Desktop feedback