【问题标题】:Children of a FrameworkElement are not rendered不呈现 FrameworkElement 的子项
【发布时间】:2015-07-28 22:00:25
【问题描述】:

我创建了一个自定义 FrameworkElement 并通过 AddLogicalChild 方法添加了多个 Child,它们也是 FrameworkElements。

但是没有渲染子元素,甚至没有调用 OnRender 方法。就像 MeasureOverride 和 ArrangeOverride 方法一样。

我做了一些研究,但我卡住了,也许有人可以帮助我。

这是我制作的两个类。在 ChildElement 类中,我在每个方法中都设置了一个断点。但如果方法被调用,除了 ctor 没有。

public class HostElement : FrameworkElement
{
    public HostElement()
    {
        ChildElement ce;
        Int32 rows = 5;
        Int32 cols = 5;

        for (Int32 i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                ce = new ChildElement();

                this.AddLogicalChild(ce);
            }
        }
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        drawingContext.DrawRectangle(Brushes.LightBlue, null, new Rect(0, 0, this.ActualWidth, this.ActualHeight));
    }
}

public class ChildElement : FrameworkElement
{
    public ChildElement()
    {
    }

    protected override void OnRender(DrawingContext dc)
    {
        base.OnRender(dc);
    }
    protected override Size MeasureOverride(Size availableSize)
    {
        return base.MeasureOverride(availableSize);
    }
    protected override Size ArrangeOverride(Size finalSize)
    {
        return base.ArrangeOverride(finalSize);
    }
}

【问题讨论】:

  • 尝试在 FrameworkElement 上调用 UpdateLayout
  • 我们能看一些代码吗?尝试通过将代码减少到演示问题所需的最低限度来隔离问题。如果解决方案没有解决问题,请在此处发布简化的代码,我们将更快地为您提供帮助! :)
  • FrameworkElement 的逻辑子代不属于可视化树。你想要一个UIElement 并添加到Children 集合中。
  • 你为什么在 C# 中这样做?为什么不按预期在 XAML 中执行此操作?似乎它也会更直接。

标签: c# wpf frameworkelement


【解决方案1】:

逻辑树和可视树之间是有区别的。你想这样做:

public class HostElement : Panel
{
    public HostElement()
    {
        ChildElement ce;
        Int32 rows = 5;
        Int32 cols = 5;

        for (Int32 i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                ce = new ChildElement();

                this.Children.Add(ce);
            }
        }
    }

    // etc...
}

More information about logical vs visual tree

【讨论】:

  • 现在您通常还会覆盖 MeasureOverride 和 ArrangeOverride。
  • @Clemens 取决于你想要完成什么,但通常是的。至少可能需要测量。
  • 如果没有,面板将不会显示任何内容。试一试。
  • 啊,可能是因为孩子们的DesiredSize默认是(0,0)。
  • 你至少得安排孩子们。
猜你喜欢
  • 2013-02-04
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2015-05-13
相关资源
最近更新 更多