【问题标题】:Collapsing parent Expander visibility in WPF without collapsing child Expander在 WPF 中折叠父 Expander 可见性而不折叠子 Expander
【发布时间】:2016-10-21 21:23:50
【问题描述】:

我正在创建一个用于读取日志的 WPF 应用程序。目前,我在扩展器内部有扩展器。当我单击扩展器时,我希望范围是该扩展器的内容。所有其他对等扩展器都消失了 (Visibility.Collapsed)。

这适用于扩展器的第一行。一旦我展开子扩展器,这将再次起作用,但父扩展器仍列在其上方。

我想折叠对等节点(与之前相同)以及父节点,但保持父节点展开,以便仅显示展开的子节点。

几句话就“展开”了很多!但无论如何...

以下是预期输出的示例

最初

  • 扩展器 1

  • 扩展器 2

  • 扩展器 3

  • 扩展器 4

假设我点击 Expander 2

  • 扩展器 2

    1. 子扩展器 1

    2. 子扩展器 2

    3. 子扩展器 3

    4. 子扩展器 4

所有其他都已折叠,但仍处于展开状态。显示儿童

假设我点击了 Child Expander 3

  1. 子扩展器 3

所有其他人都已折叠,包括父项

有没有办法做到这一点?

这是我当前的代码(一开始切换有点令人困惑)

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;
        }
    }
}

【问题讨论】:

    标签: c# wpf xaml


    【解决方案1】:

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

    【讨论】:

    • 这就是我的想法,但我想我会尝试一个问题,看看是否有某种巧妙的答案。它不会破坏这样的设计,如果可能的话,它会是完美的。我将开始寻找其他替代方案,并继续提供更多输入。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-09-13
    • 2012-12-04
    • 2011-05-25
    • 2017-01-15
    • 2020-12-10
    • 1970-01-01
    • 2010-10-25
    • 2017-01-14
    相关资源
    最近更新 更多