2011-05-10 55 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; 
}