2011-05-10 95 views
3

我有一个图像显示在DataTemplate中。我想在点击图像时更改我的图像周围的DataTemplate样式。导航WPF中的可视化树

它曾经直接嵌套在如下所示的堆栈面板中,因此我可以通过执行以下操作轻松获得父级堆栈面板。

StackPanel sp = img.Parent as StackPanel; 
<StackPanel Name="uxSessionImageItem" Style="{DynamicResource RotatorItemTemplateUnselectedStyle}" Loaded="uxSessionImageItem_Loaded" > 
    <TextBlock Name="uxLabel" Width="150" Text="{Binding SessionImageID}" Foreground="White" VerticalAlignment="Center"/> 
    <Image MouseDown="ImagePanel_MouseDown" Name="uxImage" Style="{DynamicResource ItemTemplateImageStyle}" Source="{Binding ThumbPath}"/> 
</StackPanel> 

我不得不添加其他的StackPanel和边界图像,而我需要找到堆栈面板之间。我需要什么语法才能找到不是现在是我的父母的边界,也不是边界父节点的堆叠面板,而是上面的堆叠面板?

<StackPanel Name="uxSessionImageItem" Style="{DynamicResource RotatorItemTemplateUnselectedStyle}" Loaded="uxSessionImageItem_Loaded" > 
    <TextBlock Name="uxLabel" Width="150" Text="{Binding SessionImageID}" VerticalAlignment="Center" Style="{DynamicResource ItemTemplateImageNumberStyle}"/> 
    <StackPanel Name="uxSessionImageWrapper" Style="{DynamicResource RotatorItemImageWrapperStyle}" > 
     <Border Name="uxImageBorder" Style="{DynamicResource ItemTemplateImageBorderStyle}"> 
      <Image MouseDown="ImagePanel_MouseDown" Name="uxImage" Style="{DynamicResource ItemTemplateImageStyle}" Source="{Binding ThumbPath}"/> 
     </Border> 
    </StackPanel> 
</StackPanel> 

回答

0

img.Parent.Parent.Parent是外层StackPanel。

(有在一个StackPanel同一级别上的多个元素的事实是只有一个问题,如果你走了的VisualTree,上涨总是容易,因为每个元素只能有一个父。)

编辑:由于CodeNaked指出Parent使用逻辑树,如果你只是寻找一个相对的参考,这应该不是一个问题。

0

我真的不明白,如果你已经命名你的StackPanel uxSessionImageItem,你为什么不用它来在你的代码中引用它?

+0

如果它在一个DataTemplate,那么你可以通过后台代码一样,叫不上名字的访问。每次使用DataTemplate时,可能会有多个StackPanel实例。 – CodeNaked 2011-05-10 19:37:27

+0

Thx错过了DataTemplate部分。 – Ben 2011-05-10 19:48:13

2

您可以使用VisualTreeHelper向上或向下导航可视化树。 Parent属性是逻辑父项,它是不同的。这是解释更多here

您可以使用此Linq To Visual Tree代码来使用Linq类型语句来遍历可视化树,但是这最终将利用VisualTreeHelper类。或者您可以构建扩展方法,如this one,以便找到祖先(不一定是直接父母)。

0

CodeNaked答案是好的,但我不喜欢这篇文章中的代码使用递归来完成这个简单的任务,所以这里是一个修改后的版本,它可以避免堆栈溢出(不知道WPF可以嵌套的那么多,但它是值得冒险?)

public static T FindParentOfType<T>(this DependencyObject child) where T : DependencyObject 
{ 
    DependencyObject parentDepObj = child; 
    do 
    { 
     parentDepObj = VisualTreeHelper.GetParent(parentDepObj); 
     T parent = parentDepObj as T; 
     if (parent != null) return parent; 
    } 
    while (parentDepObj != null); 
    return null; 
}