我只是在学习XAML,所以请耐心等待。
当您在XAML中嵌套元素时,似乎该元素被设置为父UI的“Child”属性。
但是在以下代码中,子元素被设置为值。那种有道理 - 有点。
然而,下面的Border Element被设置为ControlTemplate,但是ControlTemplate没有Child元素,所以有人能告诉我下面的Border和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”属性,如上所示。
答案 0 :(得分:5)
XAML解析器使用ContentPropertyAttribute
来确定如何处理子xaml元素。例如,如果您查看以下两个基本控件,您将看到它们的用法:
[ContentPropertyAttribute("Content")]
public class ContentControl : Control, IAddChild { ... }
[ContentPropertyAttribute("Items")]
public class ItemsControl : Control, IAddChild, IContainItemStorage { ... }
过去你会实现IAddChild
接口,但现在已经过时了。此外,xaml解析引擎可以识别您的“content”属性是指向单个对象还是对象集合。基本上,如果您想创建自己的自定义控件,请确保使用正确的属性来控制您的孩子的处理方式。
答案 1 :(得分:2)
XAML解析器根据父对象类型知道将内部XAML分配给哪个属性。例如,在ContentControl
下嵌套XAML会调用parentContentControl.Content = child
,而对于ItemsControl
,它会将子项添加到Items
集合:parentItemsControl.Items.Add(child)
。
我认为FrameworkTemplate
个对象(ControlTemplate
派生的对象)也是如此,并且这些类型的子控件被分配给VisualTree
属性。
答案 2 :(得分:1)
在您的问题中,ControlTemplate使用FrameElementFactory构造在XAML上定义的控件,并构建最终分配给ControlTemplate的VisualTree属性的可视化树。