방법: 논리 트리 재정의
업데이트: 2007년 11월
일반적으로는 필요하지 않지만 숙련된 컨트롤 작성자의 경우에는 필요에 따라 논리 트리를 재정의할 수 있습니다.
예제
이 예제에서는 StackPanel을 서브클래싱하여 패널이 자식 요소를 하나만 포함하고 렌더링하는 동작을 적용하기 위해 논리 트리를 재정의하는 방법을 설명합니다. 이 동작은 일반적으로 권장되지는 않지만 요소의 일반적인 논리 트리를 재정의하는 시나리오를 보여 주기 위해 이 예제에 사용되었습니다.
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의 트리를 참조하십시오.