2

我只是在学习 XAML,所以请耐心等待。

当您在 XAML 中嵌套一个元素时,该元素似乎被设置为父 UI 的“子”属性。

但是在以下代码中,子元素设置为该值。那是有道理的——有点。

但是下面的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”属性,如上所示。

4

3 回答 3

6

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

ContentControl

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

ItemsControl

[ContentPropertyAttribute("Items")]
public class ItemsControl : Control, IAddChild, IContainItemStorage { ... }

过去你会实现IAddChild接口,但现在已经过时了。此外,xaml 解析引擎可以识别您的“内容”属性是指向单个对象还是对象集合。基本上,如果您想创建自己的自定义控件,请确保使用正确的属性来控制如何处理您的孩子。

于 2013-06-26T21:47:10.700 回答
2

XAML 解析器知道根据父对象类型将内部 XAML 分配给哪个属性。例如,将 XAML 嵌套在 a ContentControlwill call下parentContentControl.Content = child,而 forItemsControl会将子代添加到Items集合中:parentItemsControl.Items.Add(child)

我想FrameworkTemplate对象(ControlTemplate派生自)也是如此,并且这些类型的子控件被分配给VisualTree属性。

于 2013-06-26T21:29:19.000 回答
1

在您的问题中,ControlTemplate 使用 FrameElementFactory 构建在 XAML 上定义的控件并构建最终分配给 ControlTemplate 的 VisualTree 属性的可视化树。

于 2013-06-26T21:36:59.520 回答