加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何创建包含(并显示)其他UIElements作为子项的自定义UIEl

发布时间:2020-12-16 01:58:45 所属栏目:百科 来源:网络整理
导读:假设我想创建一个直接从UIElement继承的类,并且能够包含一个或多个[外部添加的] UIElements作为子项 – 比如Panels和其他容器控件.很容易让班级以某种形式或其他形式收集UIElements,但我如何让它们与我的班级一起展示/呈现? 我认为它们必须以某种方式作为我
假设我想创建一个直接从UIElement继承的类,并且能够包含一个或多个[外部添加的] UIElements作为子项 – 比如Panels和其他容器控件.很容易让班级以某种形式或其他形式收集UIElements,但我如何让它们与我的班级一起展示/呈现?

我认为它们必须以某种方式作为我自己的UIElement的子项添加到可视化树中(或者,可能通过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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读