在WPF中导航可视化树

时间:2011-05-10 18:54:35

标签: wpf

我在DataTemplate中显示了一个图像。我想在单击图像时更改我的图像周围的DataTemplate的样式。

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

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 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>

4 个答案:

答案 0 :(得分:6)

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;
}

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

img.Parent.Parent.Parent是外部StackPanel。

(StackPanel中同一级别有多个元素的事实只是一个问题,如果你沿着VisualTree走下去,因为每个元素只能有一个父元素,因此总是很容易。)

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

答案 3 :(得分:0)

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