Ответ 1
Я никогда не замечал этого, и это вызывало мое любопытство. После поиска подсказок в .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, который мог бы объяснить, почему родительское свойство не установлено в этом случае... но это нужно доказать...