折叠父级扩展WPF中的可见性,而不会折叠子扩展器

时间:2016-10-21 21:23:51

标签: c# wpf xaml

我正在创建一个用于阅读日志的WPF应用程序。目前,我在扩展器内部有扩展器。当我点击Expander时,我希望范围是Expander的内容。所有其他同伴扩展器都会消失(Visibility.Collapsed)。

这适用于扩展器的第一行。一旦我扩展了子扩展器,这又可以工作,但是父扩展器仍然在它上面列出。

我想折叠同行(与之前相同)以及父,但保持父展开,以便只展开展开的子展示。

在几句话中,这是很多“扩展”!但无论如何......

以下是预期输出的示例

首先

  • Expander 1

  • Expander 2

  • Expander 3

  • Expander 4

假设我点击Expander 2

  • Expander 2

    1. 儿童扩展器1

    2. 儿童扩展器2

    3. 儿童扩展器3

    4. 儿童扩展器4

所有其他人都已崩溃,但仍在扩展。显示儿童

假设我点击Child Expander 3

  1. 儿童扩展器3
  2. 所有其他人都已折叠,包括家长

    有没有办法实现这个目标?

    这是我目前的代码(Toggling起初有点令人困惑)

    private Boolean toggleLogs = false;
    private Boolean subToggleLogs = false;
    public LogsControl()
    {
        InitializeComponent();
    }
    
    private void expanderPanel_Click(object sender, RoutedEventArgs e)
    {
        toggleLogs = !toggleLogs;
        if (toggleLogs == true)
        {
            setLogVisibility(expanderPanel);
        } else
        {
            toggleLogVisibility(expanderPanel);
        }
    }
    
    private void windowsServicePanel_Click(object sender, RoutedEventArgs e)
    {
        toggleLogs = false;
        subToggleLogs = !subToggleLogs;
        if (subToggleLogs == true)
        {
            setLogVisibility(windowsServicePanel);
        }
        else
        {
            toggleLogVisibility(windowsServicePanel);
        }
    }
    
    private void javaPanel_Click(object sender, RoutedEventArgs e)
    {
        toggleLogs = false;
        subToggleLogs = !subToggleLogs;
        if (subToggleLogs == true)
        {
            setLogVisibility(javaPanel);
        }
        else
        {
            toggleLogVisibility(javaPanel);
        }
    }
    
    public void toggleLogVisibility(StackPanel panel)
    {
        var childNumber = VisualTreeHelper.GetChildrenCount(panel);
    
        for (var i = 0; i <= childNumber - 1; i++)
        {
            var uiElement = VisualTreeHelper.GetChild(panel, i) as Expander;
    
            uiElement.Foreground = new SolidColorBrush(Colors.White);
    
            if (uiElement.IsExpanded == false)
            {
                uiElement.Visibility = Visibility.Visible;
            }
        }
    }
    
    public void setLogVisibility(StackPanel panel)
    {
        var childNumber = VisualTreeHelper.GetChildrenCount(panel);
    
        for (var i = 0; i <= childNumber - 1; i++)
        {
            var uiElement = VisualTreeHelper.GetChild(panel, i) as Expander;
    
            if (uiElement.IsExpanded == true)
            {
                uiElement.Foreground = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FF3399FF"));
                uiElement.Visibility = Visibility.Visible;
            }
            else
            {
                uiElement.Visibility = Visibility.Collapsed;
            }
        }
    }
    

1 个答案:

答案 0 :(得分:2)

如果将控件可见性设置为折叠或隐藏,则会折叠/隐藏所有子控件和内容。没办法解决这个问题。如果您想要做您想做的事情,您必须模拟层次结构。而不是实际嵌套扩展器,只是让它在屏幕上看起来像,但是你很难保持所有可见性状态同步。