XAML中的子元素

时间:2013-06-26 20:18:23

标签: wpf silverlight xaml windows-runtime

我只是在学习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”属性,如上所示。

3 个答案:

答案 0 :(得分:5)

XAML解析器使用ContentPropertyAttribute来确定如何处理子xaml元素。例如,如果您查看以下两个基本控件,您将看到它们的用法:

ContentControl

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

ItemsControl

[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属性的可视化树。