Дочерние элементы в 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", как показано выше.

701   3  

3 ответов:

Синтаксический анализатор XAML использует ContentPropertyAttribute чтобы определить, как обрабатывать дочерние элементы xaml. Например, если вы посмотрите на следующие два базовых элемента управления, вы увидите, как они используются:

ContentControl:

[ContentPropertyAttribute("Content")]
public class ContentControl : Control, IAddChild { ... }

ItemsControl:

[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

    Ничего не найдено.