2012-09-10 40 views
1

(使用VS 2010)我是WPF的新手,正在嘗試創建一個TreeViewItem,顯示2個圖像,然後顯示一些文本。爲此,我使用StackPanel。我想第一個圖像顯示/隱藏根據變化模型的財產,所以我加了一個觸發器,它的寬度設置爲0:隱藏StackPanel項目 - >調整剩餘項目的位置

<TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding Children}"> 

       <StackPanel Orientation="Horizontal" Margin="2" SnapsToDevicePixels="True" Width="Auto"> 
        <Image Width="16" Height="16"> 
         <Image.Style> 
          <Style TargetType="{x:Type Image}"> 
           <Style.Triggers> 
            <DataTrigger Binding="{Binding LinkType}" Value="Co"> 
             <Setter Property="Source" Value="/Images/Image1.png"/> 
            </DataTrigger> 
            <DataTrigger Binding="{Binding LinkType}" Value="Post"> 
             <Setter Property="Width" Value="0"/> 
            </DataTrigger> 
           </Style.Triggers> 
          </Style> 
         </Image.Style> 
        </Image> 

        <Image Source="/Images/Image2.png" 
         Width="15" 
         Height="15" 
         SnapsToDevicePixels="True" Margin="3,0"/> 
        <TextBlock Text="{Binding Name}" Margin="5,0" /> 
       </StackPanel> 



      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 

但這其實隱藏圖像,但留下一個空的GAP-堆棧面板中剩餘的項目不會滑動到左側以解釋第一個映像的「刪除」。我也嘗試以相同的結果觸發可見性。

有沒有一種方法可以在StackPanel中添加/刪除或顯示/隱藏或更改width = 0等項目,以便其餘項目相應地重新調整它們的位置?或者有沒有比堆疊面板更好的容器?

+0

+1非常好的問題,也問。 – JDB

回答

1

是的。當您使用TreeView時,TreeView的直接「子」實際上不是您的Image控件 - 您的Image控件包含在TreeViewItem控件中。這些是自動生成的,並允許TreeView以更直觀的方式處理其子元素(不強制所有控件實現TreeView子元素所需的屬性/功能)。

這很容易定製這些TeeViewItems。它們共享相同的DataContext爲您的圖像,因此您可以設置TreeView.ItemContainerStyle像這樣:

<TreeView> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding LinkType}" Value="Post"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 
+0

謝謝 - 它將'可見性'設置爲'摺疊',這樣做的伎倆。在我嘗試過'Hidden'之前,它仍然保留着空格。 – Tekito