Anleitung: Ersetzen des logischen Baums
Obwohl es in den meisten Fällen nicht erforderlich ist, haben Autoren von Steuerelementen die Möglichkeit, den logischen Baum außer Kraft zu setzen.
Beispiel
In diesem Beispiel wird beschrieben, wie Unterklassen StackPanel zum Überschreiben der logischen Struktur überschrieben werden, um ein Verhalten zu erzwingen, über das das Panel möglicherweise nur verfügt und nur ein einzelnes untergeordnetes Element rendert. Dies ist nicht unbedingt ein wünschenswertes Verhalten, wird hier jedoch als Beispiel verwendet, um das Überschreiben der normalen logischen Struktur eines Elements zu veranschaulichen.
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();
}
}
}
Weitere Informationen zum logischen Baum finden Sie unter Trees in WPF.
.NET Desktop feedback