Canvas.AddLogicalChild, Canvas.AddPhysicalChild, чем это дополнение к Canvas отличается от Canvas.Children.Add? - PullRequest
2 голосов
/ 15 ноября 2011

Я могу добавить ребенка, используя два метода, один из них -

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

Где я рисую в DrawingContext визуала, давая информацию о том, где разместить каждый элемент, например, линию.

Ивторой:

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

this.Children.Add(Visual);

Здесь я устанавливаю местоположение напрямую, а затем добавляю его к дочерним элементам Canvas.

Мои вопросы:

  1. В чем разница между этими методами.
  2. Я попытался добавить другой холст на холст, но первый метод не сработал, второй сделал, почему это так, поскольку Canvas также имеет System.Windows.Media.Visual в своей иерархии наследования.
  3. В первом методе нет упоминания о положении Visual, детали рисованиянаходятся в DrawingContext визуала, есть ли способ получить их через код?
  4. Какой из них идеален в каких случаях?

1 Ответ

3 голосов
/ 16 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...