为什么隐藏所有headers的扩展器不起作用?

Why hide all headers of the expander does not work?

有两个按钮"ShowAllExpanders"和"HideAllExpanders"

展开所有 headers 工作完美,但折叠所有只需要一些 headers,我必须每次按下按钮 "hide all" 才能一个接一个地折叠。

如果我将 Tag 绑定到扩展器,那么我可以折叠所有扩展器,但如果我只单击一个扩展器将其折叠,其余所有扩展器都会折叠。

ParameterConfigViewList 展开全部 headers 时全部 headers(计数 =17),但当我按 "hide all" 时只给出两个(计数=2)。

如果按下按钮 "HideAllExpanders",我该怎么做才能将每​​个扩展器分开并全部折叠?

Xaml代码为:

<ListView.GroupStyle> 
  <GroupStyle> 
    <GroupStyle.ContainerStyle> 
       <Style TargetType="{x:Type GroupItem}"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate> 
           <Grid> 
             <Expander IsExpanded="True"> 
               <Expander.Style> 
                <Style TargetType="{x:Type Expander}"> 
                 <Setter Property="Visibility" Value="Visible" /> 
                 <Setter Property="Template"> 
                  <Setter.Value> 
                   <ControlTemplate TargetType="{x:Type Expander}"> 
                    <Border Background="{TemplateBinding Background}"> 
                     <DockPanel> 
                       <ToggleButton x:Name="HeaderSite" MinWidth="0" MinHeight="0" Padding=" 
                         {TemplateBinding Padding}" Content="{TemplateBinding Header}" 
                         ContentTemplate="{TemplateBinding HeaderTemplate}" 
                         ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"  
                         DockPanel.Dock="Top" 
                         FocusVisualStyle="{DynamicResource ExpanderHeaderFocusVisual}"   
                         IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource 
                          TemplatedParent}}" 
                         Style="{DynamicResource ExpanderDownHeaderStyle}" /> 
                         <ContentPresenter x:Name="ExpandSite" DockPanel.Dock="Bottom" Focusable="false" 
                         Visibility="Collapsed" /> 
                      </DockPanel> 
                     </Border> 
                    <ControlTemplate.Triggers> 
                     <Trigger Property="IsExpanded" Value="true"> 
                      <Setter TargetName="ExpandSite" Property="Visibility" Value="Visible" /> 
                      </Trigger> 
                     <Trigger Property="IsEnabled" Value="false"> 
                      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
                     </Trigger> 
                    </ControlTemplate.Triggers> 
                   </ControlTemplate> 
                  </Setter.Value> 
                 </Setter> 
                </Style> 
               </Expander.Style> 
               <Expander.Header> 
                <StackPanel Orientation="Horizontal"> 
                 <TextBlock VerticalAlignment="Bottom" FontSize="14" Text="{Binding Name}" /> 
                 <TextBlock Margin="10,0,0,0" VerticalAlignment="Bottom" Text="{Binding ItemCount}" /> 
                 <TextBlock VerticalAlignment="Bottom" Text="configuration" /> 
                </StackPanel> 
              </Expander.Header> 
              <ItemsPresenter /> 
             </Expander> 
            </Grid> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </ListView.GroupStyle>

Xaml_code

View.xaml.cs中的代码:

private void HideAllExpanders_Click(object sender, RoutedEventArgs e)
{
  List<Expander> expander = GetVisualTree<Expander>(ParameterConfigViewList);
    for (int i = 0; i < expander.Count; i++)
      {
         expander[i].Height = 0;
         expander[i].Height = Double.NaN;
         expander[i].IsExpanded = false;
      }
}

private void ShowAllExpanders_Click(object sender, RoutedEventArgs e)
{
     List<Expander> expander = GetTreeObjects<Expander>(ParameterConfigViewList);
     expander.All(a => a.IsExpanded = true);
}

private List<T> GetTreeObjects<T>(DependencyObject obj) where T : DependencyObject
{
     List<T> objects = new List<T>();
     int count = VisualTreeHelper.GetChildrenCount(obj);
     for (int i = 0; i < count; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if(child != null)
            {
               T requestedType = child as T;
                if(requestedType != null)
                    objects.Add(requestedType);
                    objects.AddRange(this.GetTreeObjects<T>(child));
            }
         }
     return objects;
}

What could I do to collapse every expander apart and also to collapse all if I press button "HideAllExpanders"?

您可能想要实现以下效果。我根据您上面提供的代码制作了一个示例。

XAML:

   <Grid Margin="10">
    <ListView Name="lvUsers" Margin="0,0,290,0">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Name" Width="120" DisplayMemberBinding="{Binding Name}" />
                <GridViewColumn Header="Age" Width="50" DisplayMemberBinding="{Binding Age}" />
            </GridView>
        </ListView.View>

        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Expander IsExpanded="True">

                                        <Expander.Style>
                                            <Style TargetType="{x:Type Expander}">
                                                <Setter Property="Visibility" Value="Visible" />
                                                <Setter Property="Template">
                                                    <Setter.Value>
                                                        <ControlTemplate TargetType="{x:Type Expander}">
                                                            <Border Background="{TemplateBinding Background}">
                                                                <DockPanel>
                                                                    <ToggleButton x:Name="HeaderSite" MinWidth="0" MinHeight="0"   Content="{TemplateBinding Header}" 
                     ContentTemplate="{TemplateBinding HeaderTemplate}" 
                     ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"  
                     DockPanel.Dock="Top" 
                     FocusVisualStyle="{DynamicResource ExpanderHeaderFocusVisual}"   
                     IsChecked="{Binding IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource 
                      TemplatedParent}}" 
                     Style="{DynamicResource ExpanderDownHeaderStyle}" />
                                                                    <ContentPresenter x:Name="ExpandSite" DockPanel.Dock="Bottom" Focusable="false" 
                     Visibility="Collapsed" />
                                                                </DockPanel>
                                                            </Border>
                                                            <ControlTemplate.Triggers>
                                                                <Trigger Property="IsExpanded" Value="true">
                                                                    <Setter TargetName="ExpandSite" Property="Visibility" Value="Visible" />
                                                                </Trigger>
                                                                <Trigger Property="IsEnabled" Value="false">
                                                                    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
                                                                </Trigger>
                                                            </ControlTemplate.Triggers>
                                                        </ControlTemplate>
                                                    </Setter.Value>
                                                </Setter>
                                            </Style>
                                        </Expander.Style>


                                        <Expander.Header>
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="Gray" FontSize="22" VerticalAlignment="Bottom" />
                                                <TextBlock Text="{Binding ItemCount}" FontSize="22" Foreground="Green" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" />
                                                <TextBlock Text=" item(s)" FontSize="22" Foreground="Silver" FontStyle="Italic" VerticalAlignment="Bottom" />
                                            </StackPanel>
                                        </Expander.Header>
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListView.GroupStyle>
    </ListView>
    <Button x:Name="button" Content="HideAllExpanders" HorizontalAlignment="Left" Margin="578,52,0,0" VerticalAlignment="Top" Width="154" Click="Button_Click"/>
    <Button x:Name="button1" Content="ShowAllExpanders" HorizontalAlignment="Left" Margin="578,128,0,0" VerticalAlignment="Top" Width="154" Click="Button1_Click"/>
</Grid>

XAML.CS

    private List<T> GetTreeObjects<T>(DependencyObject obj) where T : DependencyObject
    {
        List<T> objects = new List<T>();
        int count = VisualTreeHelper.GetChildrenCount(obj);
        for (int i = 0; i < count; i++)
        {
            DependencyObject child = VisualTreeHelper.GetChild(obj, i);
            if (child != null)
            {
                T requestedType = child as T;
                if (requestedType != null)
                    objects.Add(requestedType);
                objects.AddRange(this.GetTreeObjects<T>(child));
            }
        }
        return objects;
    }

    /// <summary>
    /// ShowAllExpanders
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button1_Click(object sender, RoutedEventArgs e)
    {
        List<Expander> expander = GetTreeObjects<Expander>(lvUsers);
        expander.All(a => a.IsExpanded = true);
    }

    /// <summary>
    /// HideAllExpanders
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //List<Expander> expander = GetVisualTree<Expander>(ParameterConfigViewList);
        //for (int i = 0; i < expander.Count; i++)
        //{
        //    expander[i].Height = 0;
        //    expander[i].Height = Double.NaN;
        //    expander[i].IsExpanded = false;
        //}

        //List<Expander> expanderss = FindVisualChildren<Expander>(lvUsers).ToList();

        foreach (Expander tb in FindVisualChildren<Expander>(lvUsers))
        {
            tb.Height = 0;
            tb.Height = Double.NaN;
            tb.IsExpanded = false;
        }

    }

    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    yield return (T)child;
                }

                foreach (T childOfChild in FindVisualChildren<T>(child))
                {
                    yield return childOfChild;
                }
            }
        }
    }