2013-12-13 5 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

Когда бы вы начать процесс занимает некоторое пространство в памяти. Когда вы создаете экземпляр, он также создается в памяти. И перемещение данных из одного экземпляра в другой не освобождает память. Вы должны удалить объект, чтобы освободить его.

Хорошо! в вашем случае у вас есть strings в treeview как узлы. A treeviewNode хранит дополнительную информацию. Если вы не хотите delete узла, значит, у вас есть другой вариант.

Вы можете сохранить его в string типах list и можете dispose этот узел из treeview. A list не хранит слишком много информации, как node. Так что это сэкономит вам память.

+0

Сборщик мусора освобождает память. Утилизация - это очистка любых ресурсов, которые класс мой содержит, с которыми GC не справляется. Существует множество статей, в которых обсуждается, как работает GC и Dispose. Я предлагаю посмотреть это. –

0

Вы неправильно атакуете проблему. Вы должны настроить рекурсивную функцию на своих объектах, которая использует CollectionViewSource.GetDefaultView для каждой коллекции и установить фильтр для каждого из них. Этот фильтр затем удалит эти элементы из дерева, но фактически не удалит их. Затем вы можете рекурсивно установить фильтр в значение null, и все ваши элементы будут снова видны.

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» Вы должны объявить свойство «IsVisible». При настройке этого свойства на «свернутый», treeviewitem не занимает места в дереве

Смежные вопросы