我从来没有注意到这一点,这激起了我的好奇心。在 .Net Framework 中寻找线索后,发现 Parent 属性似乎确实是手动设置的:这需要几个步骤,但我发现更改父属性的唯一方法是调用这些方法:
如果我分析例如 FrameworkElement.AddLogicalChild 方法,我发现这些方法正在使用它:
这确认了父属性应该引用逻辑树。我尝试创建自己的自定义控件:
[ContentProperty("CustomContent")]
public class CustomControl1 : Control
{
static CustomControl1()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
}
public object CustomContent
{
get { return GetValue(CustomContentProperty); }
set { SetValue(CustomContentProperty, value); }
}
public static readonly DependencyProperty CustomContentProperty = DependencyProperty.Register("CustomContent", typeof(object), typeof(CustomControl1));
}
使用此模板:
<ControlTemplate TargetType="{x:Type local:CustomControl1}">
<ContentPresenter ContentSource="CustomContent" />
</ControlTemplate>
我是这样用的:
<WpfApplication1:CustomControl1 Width="50" Height="50">
<Rectangle Fill="Red" />
</WpfApplication1:CustomControl1>
...这就像这样(就像一个魅力:-)):
...猜猜看...矩形的父级未设置:-)
我现在没有时间继续调查,但是关于 ItemsControl,我想也许 ItemContainerGenerator 不知道它插入 itemsContainers 的逻辑父级,这可以解释为什么在这种情况下没有设置父属性......但是这需要证明...