Первый набор кода не является правильным использованием этих методов.Хотя эти методы манипулируют состоянием элемента, передаваемого в метод (а именно, изменяя визуальный и логический родительский элемент соответственно), элемент, метод которого вы вызываете, не выполняет автоматического хранения этой информации.В основном, когда используется AddVisualChild , необходимо переопределить VisualChildrenCount и GetVisualChild и вернуть этот элемент.Когда кто-то использует AddLogicalChild , он должен переопределить LogicalChildren и вернуть этот объект как часть возвращаемого им перечислителя.Фреймворк также ожидает, что эти методы будут вызываться особым образом, и не выполнение этого может привести к проблемам - определенно производительности, но могут быть и другие.Это расширенные методы, предназначенные для использования разработчиками пользовательских элементов, которым необходимо контролировать, какие элементы считаются логическими и / или визуальными дочерними элементами данного элемента.Например, панель добавит элементы, добавленные к своим дочерним элементам, как визуальные дочерние элементы - она также может добавить их как логические дочерние элементы, если элементы не были предоставлены хостом элементов.Я бы порекомендовал просто добавить элементы в коллекцию «Дети» на панели.Декоратор (например, Border) добавит Child в качестве визуального / логического дочернего элемента.Каждый из этих классов переопределяет указанные мной члены (а также другие, такие как MeasureOverride и ArrangeOverride, чтобы он мог измерять / упорядочивать эти дочерние элементы).