gpt4 book ai didi

c# - Canvas.AddLogicalChild、Canvas.AddPhysicalChild,Canvas 的这个添加与 Canvas.Children.Add 有何不同?

转载 作者:行者123 更新时间:2023-11-30 22:33:45 33 4
gpt4 key购买 nike

我可以使用两种方法添加一个 child ,一种是

Canvas.AddVisualChild(Visual);
Canvas.AddLogicalChild(Visual);

我在视觉对象的 DrawingContext 中绘制的位置给出了关于放置每个项目的位置的坐标,例如一条线。

第二个是:

Canvas.SetTop(Visual, location);
Canvas.SetLeft(Visual, (location);
Canvas.SetZIndex(Visual, someZIndex);

this.Children.Add(Visual);

这里我是直接设置location,然后添加到Canvas的children中。

我的问题是:

  1. 这些方法有什么区别。
  2. 我尝试在 Canvas 上添加另一个 Canvas ,但第一种方法不起作用,第二种方法起作用,为什么会这样,因为 Canvas 在其继承层次结构中也有 System.Windows.Media.Visual。
  3. 在第一种方法中,没有提到Visual的位置,绘图细节在visual的DrawingContext中,有没有办法通过代码检索它们?
  4. 哪一个在什么情况下最理想?

最佳答案

第一组代码不是这些方法的正确用法。虽然这些方法会操纵传递给该方法的元素的状态(即分别更改视觉和逻辑父级),但您正在调用其方法的元素不会自动存储该信息。基本上,当使用 AddVisualChild 时,必须覆盖 VisualChildrenCountGetVisualChild 并返回该元素。当使用 AddLogicalChild 时,必须覆盖 LogicalChildren 并将该对象作为它返回的枚举器的一部分返回。该框架还期望以特定方式调用这些方法,不这样做会导致问题——肯定是性能问题,但也可能是其他问题。这些是高级方法,旨在供需要控制哪些元素被视为给定元素的逻辑和/或视觉子元素的自定义元素开发人员使用。例如,一个面板会将添加到其子项的元素作为可视子项添加——如果项主机未提供项,它也可能将它们添加为逻辑子项。我建议只将元素添加到面板的 Children 集合中。装饰器(如 Border)会将 Child 添加为其视觉/逻辑子级。这些类中的每一个都会覆盖我指定的成员(以及 MeasureOverride 和 ArrangeOverride 等其他成员,因此它可以测量/排列这些子元素)。

关于c# - Canvas.AddLogicalChild、Canvas.AddPhysicalChild,Canvas 的这个添加与 Canvas.Children.Add 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8139382/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com