كيفية القيام بما يلي: تجاوز الشجرة المنطقية
على الرغم من أنه غير ضروري في معظم الحالات ،لدى الكتّاب ذوى التحكم المتقدم الخيار لتجاوز الشجرة المنطقية .
مثال
يوضح هذا المثال كيفية تجاوز الفئة الفرعية StackPanel للشجرة المنطقية, في هذه الحالة لفرض سلوك أن تحتوي اللوحة و تقوم بعرض عنصر تابع واحد فقط. هذا ليس بالضرورة سلوكاً مطلوبًا عملياً ولكن يتم عرضه كوسيلة لتوضيح سيناريو تجاوز الشجرة المنطقية العادية للعنصر.
Public Class SingletonPanel
Inherits StackPanel
'Private _children As UIElementCollection
Private _child As FrameworkElement
Public Sub New()
End Sub
Public Property SingleChild() As FrameworkElement
Get
Return _child
End Get
Set(ByVal value As FrameworkElement)
If value Is Nothing Then
RemoveLogicalChild(_child)
Else
If _child Is Nothing Then
_child = value
Else
' raise an exception?
MessageBox.Show("Needs to be a single element")
End If
End If
End Set
End Property
Public Sub SetSingleChild(ByVal child As Object)
Me.AddLogicalChild(child)
End Sub
Public Shadows Sub AddLogicalChild(ByVal child As Object)
_child = CType(child, FrameworkElement)
If Me.Children.Count = 1 Then
Me.RemoveLogicalChild(Me.Children(0))
Me.Children.Add(CType(child, UIElement))
Else
Me.Children.Add(CType(child, UIElement))
End If
End Sub
Public Shadows Sub RemoveLogicalChild(ByVal child As Object)
_child = Nothing
Me.Children.Clear()
End Sub
Protected Overrides ReadOnly Property LogicalChildren() As IEnumerator
Get
' cheat, make a list with one member and return the enumerator
Dim _list As New ArrayList()
_list.Add(_child)
Return CType(_list.GetEnumerator(), IEnumerator)
End Get
End Property
End Class
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.