Я создаю приложение WPF / XAML, которое отображает набор пользовательских элементов управления (ObjectControl) на экране.Тип ObjectControl является производным от ContentControl и имеет набор свойств, которые управляются с помощью анимации раскадровки.ObjectControl реализует трехмерное поведение (Viewport3D, PerspectiveCamera, AxisAngleRotation3D и т. Д.) И имеет соответствующую разметку XAML (в Generic.xaml).
<Viewport3D x: Name = "PART_Viewport">
<Viewport3D.Children>
<ModelVisual3D>
...
</ ModelVisual3D>
<Viewport2DVisual3D>
<Viewport2DVisual3D.Geometry>
...
</Viewport2DVisual3D.Geometry>
<Viewport2DVisual3D.Transform>
...
</Viewport2DVisual3D.Transform>
<Viewport2DVisual3D.Visual>
...
</Viewport2DVisual3D.Visual>
</Viewport3D.Children>
</ Viewport3D>
ObjectControl инициализируется в методе void OnApplyTemplate () и работает без проблем, если высоздайте его экземпляры (1) через определение в XAML или (2) программно создайте один экземпляр типа ObjectControl (из кода).В этом случае каждый экземпляр элемента управления полностью инициализируется.Когда среда выполнения вызывает метод OnApplyTemplate ().Однако, если вы создаете более одного экземпляра ObjectControl из кода, то все последующие экземпляры элемента управления, кроме первого, пропускают вызов метода OnApplyTemplate (), и это приводит к тому, что ControlTemplate не инициализируется.
В приложении мне нужно динамически управлять количеством экземпляров элемента управления на экране.Для этого я использую ItemsControl в XAML. Я использую ItemsControl, который поставляется из списка ObjectControl.Когда я помещаю программно созданный элемент управления в список, я вижу созданный экземпляр на экране, однако, когда начинаются трехмерные преобразования, возникает исключение, поскольку этот экземпляр не содержит код, инициализированный во время создания ControlTemplate.
<ItemsControl ItemsSource = "{Binding ObjectList}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ ItemsControl>
У меня вопрос к сообществу.Существуют ли способы принудительного вызова метода ContentControl.OnApplyTemplate () при создании каждого (любого) экземпляра пользовательского элемента управления (new ObjectControl ())?И это нормально делать дополнительную инициализацию пользовательского элемента управления после его создания (посредством вызова дополнительного метода Init ()), где разработчик должен поместить кусок кода, который выделяет память в куче для объектов XAML, устанавливая начальные значенияДля ControlTemplate и т. Д. (Т. Е. Которые нельзя поместить в конструктор)?Теоретически этого не должно быть, и вызова нового должно быть достаточно.