在 ContentPresenter 中查找控件的父项



这是我的代码,我试图从内容表示器内部的子控件中查找父"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));
}

这是来自窥探的视觉树。

可视化树的屏幕截图

我在标签上处理了 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>

内容演示器稍后将替换为树中显示的控件的另一个网格。

上一个代码示例中的错误,修复如下:

private T FindParent<T>(DependencyObject child) where T : DependencyObject
{
DependencyObject immediateParent = VisualTreeHelper.GetParent(child);
T parent = immediateParent as T;
if (parent != null)
return parent;
else
return FindParent<T>(immediateParent);
}

在 MSDN 上找到的答案:如何查找特定类型的父级。

private T FindParent<T>(DependencyObject child)    
where T : DependencyObject    
{    
T parent = VisualTreeHelper.GetParent(child) as T;    
if (parent != null)
{
return parent;
}
else
{
return FindParent<T>(parent);
}
}

最新更新