WPF在TreeView中折叠节点

时间:2013-12-13 12:46:44

标签: c# wpf xaml 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>

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分: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不会在树视图中占用任何空间