【问题标题】:Adding UIElement with AddLogicalChild, AddVisualChild in WPF在 WPF 中使用 AddLogicalChild、AddVisualChild 添加 UIElement
【发布时间】:2011-09-10 17:09:33
【问题描述】:

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

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

这在我添加 DrawingVisual 实例时效果很好,但是当我尝试在此处添加 Button 并定义尺寸(MinHeightMinWidth)时,它不会显示。

UIElements 是否可能需要显示不同的处理逻辑?基本上,我怎样才能将UIElement 添加到将显示并可以操作的扩展Panel

【问题讨论】:

    标签: wpf panel uielement


    【解决方案1】:

    如果仅使用 UIElements,首选方法是将这些项目添加到 Children 集合中。

    但是如果您同时使用UIElements 和Visuals,我建议使用AddLogicalChild / AddVisualChild 方法而不是Children。但是,这需要更多的工作:

    1. 使用 AddLogicalChildAddVisualChild 将项目(Visuals 和 UIElements)添加为逻辑和可视子项。
    2. 将项目存放在某处(小组不会为您这样做)
    3. 覆盖GetVisualChildVisualChildrenCount并返回项目数/传递索引上的项目
    4. 覆盖 MeasureOverride,在每个 UIElement 上调用 UIElement.Measure 并执行所有其他特定于您的面板的测量工作
    5. 覆盖 ArrangeOverride,为每个 UIElement 调用 UIElement.Arrange 并执行所有其他特定于您的面板的安排内容

    注意MeasureArrange 必须在 UIElement 添加到Panel 之后调用。

    就是这样。 :)

    【讨论】:

      【解决方案2】:

      对于UIElements,使用集合Children

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

      您还应该查看InternalChildren 集合,建议在Panels 的扩展中使用它。

      【讨论】:

      • 这是真的,但 AddLogicalChild/AddVisualChild 会覆盖任何其他视觉效果。换句话说,只要我通过调用这两个方法创建视觉对象,就不会绘制子对象。
      • 好的,我尝试添加到 InternalChildren 集合中,但视觉上什么也没发生。我猜有两种可能的情况:Visuals 和 Add...Child 不打算与现有控件一起使用,或者我遗漏了一些东西...
      【解决方案3】:

      该功能已包含在内。如果您想将UIElements 添加到您的Panel,只需使用.Children.Add() - 就像您使用常规的CanvasGrid 等一样。

      然后在您的实现中,覆盖 MeasureOverrideArrangeOverride 以遍历子代并在您的 Panel 表面上组织它们。

      此处示例:http://msdn.microsoft.com/en-us/library/ms754152(v=vs.110).aspx#Panels_custom_panel_elements

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        相关资源
        最近更新 更多