Вот мой код, который я пытаюсь найти родительским «NodeItem» из дочернего элемента управления, который находится внутри предъявителя контента.
private static DependencyObject GetParentObject(DependencyObject child)
{
if(child == null)
{
return null;
}
var result = child as NodeItem;
if (result != null)
{
return result;
}
ContentElement contentElement = child as ContentElement;
if(contentElement != null)
{
DependencyObject parent = ContentOperations.GetParent(contentElement);
if(parent != null)
{
return GetParentObject(parent);
}
}
FrameworkElement fe = child as FrameworkElement;
if(fe != null)
{
DependencyObject parent = fe.Parent;
if(parent != null)
{
return GetParentObject(parent);
}
}
return GetParentObject(VisualTreeHelper.GetParent(child));
}
А вот визуальное дерево из snoop.
снимок экрана визуального дерева
Я обработал OnDrop для метки и хочу получить доступ к узлу узла из этого обработчика события.
здесь XAML
<Grid>
<!--
This border indicates that node is selected.
Normally it is transparent, but when 'IsSelected' is set
to 'true' the border brush becomes blue and its background
becomds light blue.
-->
<Border
x:Name="selectionBorder"
Margin="{TemplateBinding Margin}"
Padding="{TemplateBinding Padding}"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
CornerRadius="2">
<Border.Style>
<Style>
<Setter Property="Control.Effect">
<Setter.Value>
<DropShadowEffect
Opacity="0.1"
ShadowDepth="1"
Color="#FF151414" />
</Setter.Value>
</Setter>
</Style>
</Border.Style>
<!--
User-defined node content is presented here.
-->
<ContentPresenter />
</Border>
</Grid>
Content Presenter позднее заменяется другой сеткой с элементами управления, отображаемыми в дереве.