在WPF中添加带有AddLogicalChild、AddVisualChild的UIElement

在WPF中添加带有AddLogicalChild、AddVisualChild的UIElement,wpf,panel,uielement,Wpf,Panel,Uielement,我通过简单地扩展/继承面板创建了画布的自定义版本 当我想在上面绘制或渲染某些东西时,我只需创建一个DrawingVisual,绘制所需的图形并调用AddLogicalChild(Visual),AddVisualChild(Visual),并增加面板的视觉效果计数 当我添加DrawingVisual实例时,这非常有效,但当我尝试在此处添加按钮并定义尺寸(MinHeight,MinWidth)时,它不会显示 ui元素是否可能需要显示不同的处理逻辑?基本上,我如何才能将UIElement添加到将要显

我通过简单地扩展/继承面板创建了画布的自定义版本

当我想在上面绘制或渲染某些东西时,我只需创建一个
DrawingVisual
,绘制所需的图形并调用
AddLogicalChild(Visual)
AddVisualChild(Visual)
,并增加面板的视觉效果计数

当我添加
DrawingVisual
实例时,这非常有效,但当我尝试在此处添加
按钮
并定义尺寸(
MinHeight
MinWidth
)时,它不会显示


ui元素
是否可能需要显示不同的处理逻辑?基本上,我如何才能将
UIElement
添加到将要显示并可使用操作的扩展
面板中?

对于
UIElement
s,使用的是集合
子对象

public void AddChild(UIElement newChild)
{
   this.Children.Add(newChild);
}

您还应该查看建议在
面板
s的扩展中使用的集合。

该功能已经包含在内。如果要将
ui元素
添加到
面板
,只需使用
.Children.add()

然后在您的实现中,覆盖
MeasureOverride
ArrangeOverride
以迭代子项并在
面板上组织它们


这里的示例:

如果只使用
UIElement
s
,首选的方法是将该项添加到
子项
集合中

但是如果您混合了
UIElement
s和
Visual
s
,我建议使用
AddLogicalChild
/
AddVisualChild
方法,而不是
子对象。但是,这需要做更多的工作:

  • 使用
    AddLogicalChild
    AddVisualChild
    将项(
    Visual
    s以及
    UIElement
    s)添加为逻辑和可视子项
  • 将物品存放在某个地方(面板无法为您执行此操作)
  • 覆盖
    GetVisualChild
    VisualChildrenCount
    并返回传递索引上的项目数/项目数
  • 覆盖测量覆盖,调用
    UIElement。对每个
    UIElement
    进行测量,并执行面板特定的所有其他测量工作
  • 覆盖排列覆盖,调用
    UIElement。为每个
    UIElement
    排列
    ,并执行面板特定的所有其他排列操作
  • 请注意,在将UIElement添加到
    面板
    后,必须调用
    测量
    排列


    就这样。:)

    这是正确的,但是AddLogicalChild/AddVisualChild会覆盖任何其他视觉效果。换句话说,当我通过调用这两个方法创建visual时,子对象就不会被绘制。好的,我尝试添加到InternalChildren集合中,但在视觉上什么都没有发生。我猜有两种可能的情况:要么是视觉效果和添加…Child不打算与现有控件一起使用,要么我缺少一些东西。。。