2013-12-13 70 views
0

所以,我有一个树状图,我有一个列表。我想对它应用一个过滤器,并且所有不符合过滤器上单词的节点都会崩溃,所以它们不占用空间。WPF折叠TreeView中的节点

的问题是,即使我将它们设置为崩溃,他们仍然需要最小的空间量...

 <TreeView x:Name="UserTree"> 
      <TreeView.Resources> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" 
    Color="Transparent" /> 
       <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" 
    Color="Black" /> 
      <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" 
    Color="Transparent" /> 
      <local:SumConverter x:Key="sumConverter"/> 
     </TreeView.Resources> 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding UserList}"> 
       <Border x:Name="headerTree" Background="#FFD3D1D1" CornerRadius="3" Padding="2" 
    Margin="2"> 
        <Grid Width="330" Height="20"> 
         <TextBlock Text="{Binding Name}" Name="txtGroupName" Width="280" 
    Height="20" FontFamily="Palatino Linotype" Foreground="Black" VerticalAlignment="Center" 
    AllowDrop="True" Drop="TextBlock_Drop" Padding="5,0,0,0" HorizontalAlignment="Left" 
    Margin="0,2,0,0" /> 
         <CheckBox x:Name="cbSelector" HorizontalAlignment="Right" 
    VerticalAlignment="Center" Margin="0,0,5,0" Checked="cbSelector_Checked" 
    Unchecked="cbSelector_Unchecked" /> 
        </Grid> 
        </Border> 
        <HierarchicalDataTemplate.ItemTemplate> 
         <DataTemplate> 
          <Grid Width="320" Visibility="{Binding isVisible}"> 
           <CheckBox Margin="16,1,1,1" VerticalAlignment="center" 
    Checked="ChkUser_Checked" Unchecked="chkUser_Unchecked" 
            IsChecked="{Binding IsListed}" 
    PreviewMouseMove="CheckBox_PreviewMouseMove" 
            PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown" ToolTipService.ToolTip=" 
    {Binding Section}"> 
            <CheckBox.Content> 
             <MultiBinding Converter="{StaticResource sumConverter}"> 
              <Binding Path="Name"/> 
              <Binding Path="Status"/> 
             </MultiBinding> 
            </CheckBox.Content> 
           </CheckBox> 
           <Image Source="{Binding ImagemStatus}" Width="16" Height="16" 
    HorizontalAlignment="Left" Margin="0,2,0,0" /> 
           <Button x:Name="btnRemoveFromGroup"  Click="btnRemoveFromGroup_Click" HorizontalAlignment="Right" Width="16px" Height="16px" 
VerticalAlignment="Top" Style="{StaticResource MyButtonStyle}" Foreground="{x:Null}" 
ToolTipService.ToolTip="Remove from group" Content=" 
    {Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type 
    TreeViewItem}, AncestorLevel=2}, Path=DataContext.ObtainGroup}"> 
            <Button.Background> 
             <ImageBrush ImageSource="Imagens/Grp.png"/> 
            </Button.Background> 
           </Button> 
          </Grid> 
         </DataTemplate> 
        </HierarchicalDataTemplate.ItemTemplate> 
       </HierarchicalDataTemplate> 
      </TreeView.ItemTemplate> 
      <TreeView.ItemContainerStyle> 
       <Style TargetType="{x:Type TreeViewItem}"> 
        <Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter> 
       </Style> 
      </TreeView.ItemContainerStyle> 
     </TreeView> 

<Style x:Key="MyButtonStyle" TargetType="Button"> 
      <Setter Property="OverridesDefaultStyle" Value="True"/> 
      <Setter Property="Margin" Value="5"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border Name="border" 
          BorderThickness="0" 
          Padding="4,2" 
          BorderBrush="DarkGray" 
          CornerRadius="3" 
          Background="{TemplateBinding Background}"> 
          <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
         </Border> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="border" Property="BorderBrush" Value="Black" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
+0

折叠不会从实例(从内存)中删除它们,您将不得不处置这些节点的实例 – Shaharyar

+0

因此,摆脱空间的唯一方法是将它们移动到另一个列表(例如)或删除它? – HDD

+0

移动他们不会将他们从内存中删除,你将不得不处置 – Shaharyar

回答

0

当你曾经启动一个进程,它需要一些内存空间。当你创建一个实例时,它也会在内存中创建。将数据从一个实例移动到另一个实例不会释放内存。你必须处理这个对象来释放它。

好吧!在你的情况下,你在treeview中有strings作为节点。一个treeviewNode存储一些额外的信息。如果您不想delete节点,那么您有另一种选择。

您可以将它保存在string类型list中,并且可以将dispose保存为treeview的那个节点。 A list不存储太多的信息,因为node。所以它会为你节省一些记忆。

+0

垃圾回收器释放内存。处置是为了清理GC所不能处理的类所包含的任何资源。有许多文章讨论GC和Dispose模式如何工作。我建议你看这个。 –

0

你正在攻击错误的问题。你应该在你的对象上设置一个递归函数,在每个集合上使用CollectionViewSource.GetDefaultView,并在每个集合上设置Filter。然后这个过滤器会从树形视图中移除这些项目,但不会实际删除它们。然后,您可以递归地将筛选器设置为空,并且所有项目都将再次可见。

0

我觉得你的问题可以用下面的代码来解决:

<TreeView x:Name="UserTree"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}"> 
      <Setter Property="Visibility" Value="{Binding IsVisible}" /> 
     </Style> 
     </TreeView.ItemContainerStyle> 

     ... 

</TreeView> 

在你的类“UserList的”必须声明一个名为“可见性”属性。当将此属性设置为“折叠”时,treeviewitem不会在树视图中占用任何空间