2011-03-22 13 views
6

Estoy intentando cambiar el icono de mi TreeView en un icono de carpeta. También cuando se colapsa necesita tener un ícono de carpeta abierta.¿Cómo puedo cambiar el icono TreeView en un icono de carpeta?

Mi vista de árbol ha DataBound artículos en ella y el código es:

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

También Éste es cómo llenar la vista de árbol con elementos de XML (es un cortado con tijeras de una gran cantidad de código:

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

Respuesta

10

Incidentalmente hice algo como esto hace unos días. En mi aplicación se agrega un icono de carpeta en la HierarchicalDataTemplate a esos objetos que se comportan como carpetas, utilizo un disparador para cambiar el ícono según si el ítem está expandido o no , aquí está el fragmento relevante de 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> 

Dónde {StaticResource Icon_FolderOpen} y {StaticResource Icon_FolderClosed} son BitmapImages que sostienen los iconos de los estados de la carpeta. IconImageStyleSmall es un estilo que establece MaxWidth y MaxHeight de las imágenes en algo apropiado.


Editar : Por el amor de su finalización.

<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

Cuestiones relacionadas