Добавление UIElement с помощью AddLogicalChild, AddVisualChild в WPF - PullRequest
3 голосов
/ 08 июня 2011

Я создал собственную версию canvas, просто расширяя / наследуя от Panel.

Когда я хочу нарисовать или визуализировать что-то на нем, я просто создаю DrawingVisual, рисую нужную графику и вызываюAddLogicalChild(Visual), AddVisualChild(Visual) и увеличение количества визуалов панели.

Это прекрасно работает, когда я добавляю DrawingVisual экземпляров, но когда я пытаюсь добавить сюда Button и определитьразмеры (MinHeight, MinWidth) не отображаются.

Возможно ли, что UIElements нужна другая логика обработки для отображения?По сути, как я могу добавить UIElement к этому расширенному Panel, который будет отображаться и которым можно манипулировать?

Ответы [ 3 ]

1 голос
/ 23 мая 2017

При работе только с UIElement s предпочтительным способом является добавление этих элементов в коллекцию Children.

Но , если у вас есть смесь UIElement с и Visual с , я бы предложил использовать методы AddLogicalChild / AddVisualChild вместо Children. Однако это требует немного больше работы:

  1. Добавьте элемент (Visual s, а также UIElement s) в качестве логических и визуальных дочерних элементов, используя AddLogicalChild и AddVisualChild.
  2. Храните предметы где-нибудь (Панель не сделает это за вас)
  3. Перезаписать GetVisualChild и VisualChildrenCount и вернуть количество элементов / элемент в переданном индексе
  4. Перезаписать MeasureOverride, наберите UIElement.Measure для каждого UIElement и выполните все остальные операции измерения, специфичные для вашей панели
  5. Перезаписать ArrangeOverride, позвоните UIElement.Arrange для каждого UIElement и сделайте все остальные вещи, относящиеся к вашей панели

Обратите внимание, что Measure и Arrange должны называться после UIElement был добавлен к Panel.

Вот и все. :)

0 голосов
/ 03 декабря 2013

Эта функциональность уже включена. Если вы хотите добавить UIElements к вашему Panel, просто используйте .Children.Add() - так же, как вы делаете с обычными Canvas, Grid и т. Д.

Затем в вашей реализации переопределите MeasureOverride и ArrangeOverride, чтобы выполнить итерацию по дочерним элементам и организовать их на вашей Panel поверхности.

Пример здесь: http://msdn.microsoft.com/en-us/library/ms754152(v=vs.110).aspx#Panels_custom_panel_elements

0 голосов
/ 08 июня 2011

Для UIElement s это коллекция Children для использования:

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

Вы также должны взглянуть на коллекцию InternalChildren , которую рекомендуется использовать в расширениях Panel s.

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