Anvisningar: Åsidosätt det logiska trädet
Även om det inte är nödvändigt i de flesta fall har avancerade kontrollförfattare möjlighet att åsidosätta det logiska trädet.
Exempel
I det här exemplet beskrivs hur du skapar en subklass av StackPanel för att åsidosätta det logiska trädet, i detta fall för att tvinga fram ett beteende där panelen endast tillåts ha och rendera ett enda underordnat element. Detta är inte nödvändigtvis ett praktiskt önskvärt beteende, men visas här som ett sätt att illustrera scenariot för att åsidosätta ett elements normala logiska träd.
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();
}
}
}
Mer information om det logiska trädet finns i Träd i WPF.
.NET Desktop feedback