假设我想创建一个直接继承的类,UIElement
并且能够包含一个或多个[外部添加] UIElement
作为子项 - 比如Panel
s和其他容器控件.很容易让班级UIElement
以某种形式或其他形式收集s,但我如何让它们与我的班级一起展示/呈现?
我认为必须将它们添加到可视化树为我自己的孩子,UIElement
以某种方式(或可能的话,手动使他们通过LA去VisualTreeHelper.GetDrawing
,并用做OnRender
的DrawingContext
?但似乎笨拙).
我不是想知道我可以-或者应该-从多个现成的控制,继承一样FrameworkElement
,Panel
,ContentControl
等(如果有的话,我想知道如何,他们正在实施外部添加子元素的显示/渲染,如适用) .
我有理由希望在层次结构中尽可能高,所以请不要给我任何关于为什么XAML/WPF框架"合规"等是好事的讲座等.
以下类在子元素的布局和呈现方面提供绝对最小值:
public class UIElementContainer : UIElement { private readonly UIElementCollection children; public UIElementContainer() { children = new UIElementCollection(this, null); } public void AddChild(UIElement element) { children.Add(element); } public void RemoveChild(UIElement element) { children.Remove(element); } protected override int VisualChildrenCount { get { return children.Count; } } protected override Visual GetVisualChild(int index) { return children[index]; } protected override Size MeasureCore(Size availableSize) { foreach (UIElement element in children) { element.Measure(availableSize); } return new Size(); } protected override void ArrangeCore(Rect finalRect) { foreach (UIElement element in children) { element.Arrange(finalRect); } } }
不需要具有UIElementCollection.另一种实现可能如下所示:
public class UIElementContainer : UIElement { private readonly List<UIElement> children = new List<UIElement>(); public void AddChild(UIElement element) { children.Add(element); AddVisualChild(element); } public void RemoveChild(UIElement element) { if (children.Remove(element)) { RemoveVisualChild(element); } } // plus the four overrides }