如何以编程方式展开窗口中的所有扩展器

时间:2015-01-14 15:46:28

标签: c# wpf expander

我有一个带有扩展器的窗口。 打开扩展器时,其中有一些信息。

我需要做的是用一个按钮打开所有扩展器,这样它们内部的所有内容都变得可见。 当一切都可见时,我想打印整页。

这是我现在扩展所有扩展器的代码:

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

我用来迭代我的控件的行:

foreach (Expander exp in FindVisualChildren<Expander>(printpage))
{
    exp.IsExpanded = true;
}

现在要点:

上面的代码适用于大多数情况。 我唯一的问题是有时在扩展器中有一些扩展器。 当上述代码执行时,父扩展器会扩展,但子扩展器仍未扩展。

我希望有人可以教我如何扩展这些儿童扩张器。

修改
我忘了提到儿童扩张器不是主扩张器的直接儿童。
他们是主要扩张者儿童的孩子。

我的控制树是这样的:

-Stackpanel
---列表项目
-----电网
-------膨胀机(主膨胀机)
---------电网
-----------文本块
-------------扩展器

所以我需要扩展这棵树中的所有扩展器。

3 个答案:

答案 0 :(得分:1)

你的代码已经非常复杂了。如果你打电话并且你真的应该以递归的方式执行你的方法,那么绝对没有必要产生收益。

当你的方法中遇到一个带孩子的控件时,你会调用相同的方法但是使用一个新的视觉根,这个控件将是你刚才找到的孩子的控件。

答案 1 :(得分:0)

这对您有用(可能是一些语法错误,但我确定您是否可以修复它们)

foreach (Expander exp in FindVisualChildren<Expander>(printpage))
{
    exp.IsExpanded = true;
    for(int i =0;i<exp.Children.Count;i++)
    {
        if(exp.Children[i] is Expander)
        {
             expandChildren(exp.Children[i]);
        }
    }
}

private expandChildren(Expander exp)
{
    exp.IsExpanded = true;
    for(int i =0;i<exp.Children.Count;i++)
    {
        if(exp.Children[i] is Expander)
        {
             expandChildren(exp.Children[i]);
        }
    }       
}

答案 2 :(得分:0)

好的,我在这个post

中找到了我的anwser

这个问题上的回答是我用来解决问题的方法。

这是我使用的功能:

public static List<T> GetLogicalChildCollection<T>(object parent) where T : DependencyObject
{
    List<T> logicalCollection = new List<T>();
    GetLogicalChildCollection(parent as DependencyObject, logicalCollection);
    return logicalCollection;
}

private static void GetLogicalChildCollection<T>(DependencyObject parent, List<T> logicalCollection) where T : DependencyObject
{
    IEnumerable children = LogicalTreeHelper.GetChildren(parent);
    foreach (object child in children)
    {
        if (child is DependencyObject)
        {
            DependencyObject depChild = child as DependencyObject;
            if (child is T)
            {
                logicalCollection.Add(child as T);
            }
            GetLogicalChildCollection(depChild, logicalCollection);
        }
    }
}

在我的代码中,我使用这些行将我需要的东西追加到扩展器中:

List<Expander> exp = GetLogicalChildCollection<Expander>(printpage.StackPanelPrinting);

foreach (Expander exp in expander)
{
    exp.IsExpanded = true;
    exp.FontWeight = FontWeights.Bold;
    exp.Background = Brushes.LightBlue;
}