2011-03-22 76 views
6

我試圖改變我的TreeView在一個文件夾圖標中的圖標。另外,當它崩潰時,它需要打開一個文件夾圖標。如何將TreeView圖標更改爲文件夾圖標?

我的樹形已數據綁定物品,並代碼:

<TreeView x:Name="TreeViewCategories" Grid.Row="0" Grid.Column="1" Height="610" HorizontalAlignment="Left" Margin="29,111,0,0" VerticalAlignment="Top" Width="315" BorderThickness="0" Background="Transparent" > 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
      <TextBlock FontSize="20" Text="{Binding Name}" PreviewMouseDown="TextBlock_PreviewMouseDown"/> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

而且我這是怎麼填滿來自XML項目樹形視圖(這是一個剪斷出來的很多代碼:

private void LoadHospitalXML() 
{ 
    try 
    { 
     FileStream fs = new FileStream("ConfigOrgHospital.xml", FileMode.Open, FileAccess.Read); 

     var xml = XmlReader.Create(fs); 

     rootElement = ConvertHospitalData(xml); 

     this.TreeViewCategories.ItemsSource = null; 
     List<HospitalWrapper> li = new List<HospitalWrapper>(); 
     var hosp = rootElement.Items.FirstOrDefault(); 
     if (hosp != null) 
     { 
      foreach (var i in hosp.Hospital) 
      { 
       li.AddIfNotNull(CreateHospList(i)); 
      } 
     } 

     this.TreeViewCategories.ItemsSource = li; 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show(e.Message); 
    } 

} 

private HospitalWrapper CreateHospList(object obj) 
{ 
    var newItem = new HospitalWrapper(); 

    newItem.Context = obj; 
    //Hospital Names// 
    if (obj is HospitalDataHospitalsHospital) 
    { 
     var hosp = (HospitalDataHospitalsHospital)obj; 

     //newItem.Title = "Hospitals"; 
     newItem.Name = hosp.DefaultName; 

     var tmp = new HospitalWrapper(); 
     tmp.Name = "Sites"; 
     tmp.IsTitle = true; 

     if (hosp.Sites != null) 
      foreach (var i in hosp.Sites) 
      { 
       tmp.Items.AddIfNotNull(CreateHospList(i)); 
      } 
     newItem.Items.Add(tmp); 

     tmp = new HospitalWrapper(); 
     tmp.Name = "Specialties"; 
     tmp.IsTitle = true; 

     if (hosp.Deps != null) 
      foreach (var j in hosp.Deps) 
      { 

       tmp.Items.AddIfNotNull(CreateHospList(j)); 
      } 

     newItem.Items.Add(tmp); 
    } 
} 

回答

10

我在前幾天做了這樣的事情,在我的應用程序中,文件夾圖標被添加到HierarchicalDataTemplate中,這些對象的行爲與文件夾類似,我使用觸發器來根據項目是否展開來更改圖標,這裏是XAML的相關位:

<HierarchicalDataTemplate DataType="{x:Type data:FeedComposite}" 
           ItemsSource="{Binding Path=Children}"> 
     <StackPanel Orientation="Horizontal" Margin="1"> 
      <StackPanel.Children> 
       <Image> 
        <Image.Style> 
         <Style BasedOn="{StaticResource IconImageStyleSmall}" TargetType="Image"> 
          <Setter Property="Source" Value="{Binding Source={StaticResource Icon_FolderClosed}, Mode=OneTime}"/> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsExpanded}" Value="True"> 
            <Setter Property="Source" Value="{Binding Source={StaticResource Icon_FolderOpen}, Mode=OneTime}"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Image.Style> 
       </Image> 
       <TextBlock Text="{Binding Title}"/> 
      </StackPanel.Children> 
     </StackPanel> 
    </HierarchicalDataTemplate> 

{StaticResource Icon_FolderOpen}{StaticResource Icon_FolderClosed}BitmapImages持有的文件夾狀態的圖標。 IconImageStyleSmall是一種將圖像的MaxWidthMaxHeight設置爲適當的樣式的樣式。


編輯:完成的緣故。

<BitmapImage x:Key="Icon_FolderOpen" UriSource="pack://application:,,,/ImageResources/Icons/FolderOpen.ico" /> 
<BitmapImage x:Key="Icon_FolderClosed" UriSource="pack://application:,,,/ImageResources/Icons/FolderClosed.ico" /> 

<Style x:Key="IconImageStyleSmall" TargetType="Image"> 
    <Setter Property="MaxWidth" Value="16"/> 
    <Setter Property="MaxHeight" Value="16"/> 
    <Setter Property="Margin" Value="1"/> 
</Style> 

Icons used

相關問題