Дочерние элементы в XAML
Я только учусь XAML, так что потерпите.
При вложении элемента в XAML создается впечатление, что этот элемент имеет свойство "Дочерний" родительского пользовательского интерфейса.
Однако в следующем коде дочернему элементу присваивается значение. Что имеет смысл - своего рода.
Однако затем элемент Border ниже был установлен в ControlTemplate, но ControlTemplate не имеет дочернего элемента, поэтому кто-нибудь может сказать мне, что именно является отношением между границей и ControlTemplate внизу? Возможно, вы могли бы переписать этот фрагмент в c# в качестве объяснения.
<Setter Property="Template" >
<Setter.Value>
<ControlTemplate TargetType="dtp:PickerSelectorItem">
<Border HorizontalAlignment="Stretch" VerticalAlignment="Stretch" >
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="Picker">
<VisualState x:Name="Focused">
<Storyboard>
<!-- There is more code but snipped for irrelevance-->
Также как компилятор XAML понимает, что на самом деле делает дочерний элемент? Т. е., как он знает, что дочерний элемент должен быть установлен в свойство "Child", тогда как в других случаях он был бы установлен в свойство" Value", как показано выше.
3 ответов:
Синтаксический анализатор XAML использует
ContentPropertyAttributeчтобы определить, как обрабатывать дочерние элементы xaml. Например, если вы посмотрите на следующие два базовых элемента управления, вы увидите, как они используются:[ContentPropertyAttribute("Content")] public class ContentControl : Control, IAddChild { ... }[ContentPropertyAttribute("Items")] public class ItemsControl : Control, IAddChild, IContainItemStorage { ... }Раньше считалось, что вы будете реализовывать
IAddChildинтерфейс, но он уже устарел. Кроме того, механизм синтаксического анализа xaml может распознать, указывает ли ваше свойство "content" на один объект или коллекцию объектов. В принципе, если вы хотите создать свой собственный пользовательский элемент управления, убедитесь, что используете правильный атрибут для управления тем, как обрабатывается ваш ребенок(ren).
Синтаксический анализатор XAML знает, какому свойству назначить внутренний XAML в соответствии с типом родительского объекта. Например, вложенность XAML под
ContentControlвызоветparentContentControl.Content = child, в то время как дляItemsControlон добавит дочерние элементы в коллекциюItems:parentItemsControl.Items.Add(child).Я предполагаю, что то же самое верно для объектов
FrameworkTemplate(из которых происходитControlTemplate), и дочерние элементы управления для этих типов назначаются свойствуVisualTree.
В вашем вопросе ControlTemplate использует FrameElementFactory для построения элементов управления, определенных на XAML, и строит визуальное дерево, которое в конечном итоге назначается свойству VisualTree ControlTemplate.
Comments