Nasıl yapılır: Mantıksal Ağacı Geçersiz Kılma
Çoğu durumda gerekli olmamasına rağmen, Gelişmiş denetim yazarlarının mantıksal ağacı geçersiz kılma seçeneği vardır.
Örnek
Bu örnekte StackPanel , panelin yalnızca sahip olabileceği ve yalnızca tek bir alt öğeyi oluşturabileceği bir davranışı zorlamak için mantıksal ağacı geçersiz kılmak üzere nasıl alt sınıf yapılacağı açıklanmaktadır. Bu, neredeyse istenen bir davranış değildir, ancak burada bir öğenin normal mantıksal ağacını geçersiz kılma senaryosunu gösteren bir yol olarak burada gösterilmiştir.
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();
}
}
}
Mantıksal ağaç hakkında daha fazla bilgi için bkz. WPF Içindeki ağaçlar.