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

C# 如何以编程方式扩展窗口中的所有扩展器,c#,wpf,expander,C#,Wpf,Expander,我有一个装有扩展器的窗户。 当你打开扩展器时,里面有一些信息 我需要做的是用一个按钮打开所有扩展器,这样里面的所有东西都可以看到。 当一切都可见时,我想打印整页 这是我现在展开所有扩展器的代码: public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject { if (depObj != null) {

我有一个装有扩展器的窗户。 当你打开扩展器时,里面有一些信息

我需要做的是用一个按钮打开所有扩展器,这样里面的所有东西都可以看到。 当一切都可见时,我想打印整页

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

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;
            }
        }
    }
}
公共静态IEnumerable FindVisualChildren(DependencyObject depObj),其中T:DependencyObject
{
if(depObj!=null)
{
for(int i=0;i
我用于在控件中迭代的行:

foreach (Expander exp in FindVisualChildren<Expander>(printpage))
{
    exp.IsExpanded = true;
}
foreach(FindVisualChildren中的Expander exp(打印页))
{
exp.IsExpanded=true;
}
现在直截了当地说:

上述代码在大多数情况下都有效。 我唯一的问题是,有时扩展器中有一些扩展器。 当执行上述代码时,父扩展器会展开,但子扩展器仍保持未展开状态

我希望有人能教我如何扩大这些儿童扩张器了

编辑
我忘了提到子扩展器不是主扩展器的直接子扩展器。
它们是主扩展器的子代

我的控制树是这样的:

-Stackpanel
---列表项
-----网格
-------扩展器(主扩展器)
---------网格
-----------文本块
-------------扩展器


因此,我需要展开此树中的所有扩展器。

您的代码已经相当复杂了。如果您调用并且确实应该以递归方式执行您的方法,则绝对不需要收益率

当在方法中遇到带有子控件的控件时,调用同一个方法,但使用一个新的可视根,这将是一个带有您刚找到的子控件的控件。

这应该适合您(可能有一些语法错误,但我确信如果有,您可以修复它们)

foreach(FindVisualChildren中的Expander exp(打印页))
{
exp.IsExpanded=true;

对于(int i=0;i好的,我在这里找到了我的答案

这个问题的答案是我用来解决问题的

以下是我使用的函数:

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);
        }
    }
}
公共静态列表GetLogicalChildCollection(对象父对象),其中T:DependencyObject
{
List logicalCollection=新列表();
GetLogicalChildCollection(父对象作为DependencyObject,logicalCollection);
返回逻辑集合;
}
私有静态void GetLogicalChildCollection(DependencyObject父对象,List logicalCollection),其中T:DependencyObject
{
IEnumerable children=LogicalTreeHelper.GetChildren(父级);
foreach(子对象中的对象子对象)
{
if(子对象是DependencyObject)
{
DependencyObject depChild=作为DependencyObject的子对象;
如果(孩子是T)
{
logicalCollection.Add(子级为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;
}
List exp=GetLogicalChildCollection(printpage.StackPanelPrinting);
foreach(扩展器中的扩展器exp)
{
exp.IsExpanded=true;
exp.FontWeight=FontWeights.Bold;
exp.Background=brusks.LightBlue;
}

我已经编辑了您的标题。请参见“”,其中的共识是“不,他们不应该”。我理解,谢谢您的编辑;)为什么不检查扩展器的子级,如果扩展器重复运行直到全部打开,您知道它失败的原因吗?
FindVisualChildren
是否不包含内部的
扩展器
?是否
IsExpanded
设置为
true
,但WPF不会重新计算布局?您的建议听起来像是混音“递归枚举”逻辑和“扩展逻辑”在同一个函数中-可读性和可重用性较差。我不认为这是一个改进。出于可重用性目的,您可以将操作作为第二个参数传递到递归方法中。这样您可以将枚举与操作分离。当然,但它与
yield
版本一样复杂,但灵活性较差:例如,yo你可以使用
Enumerable.Where
Enumerable.Select
Enumerable.Count
&可枚举版本上的朋友。有效点。但你问的是如何展开所有子级,而不是如何枚举所有级别上的子级。我需要展开所有子级,但子级扩展器不是主扩展器的直接子级。它们是主扩展器子级的子级。您不应该复制代码两次。只需在第一个循环中调用
expandChildren
。请确保再次使用
FindVisualChildren
,因为它们不是直接子级。您的代码不工作..扩展器没有子级属性..只有内容。因此,当脚本扩展expander并搜索expander子项,但找不到任何子项(使用VisualTreeHelper.GetChildrenCount(expander))。
List<Expander> exp = GetLogicalChildCollection<Expander>(printpage.StackPanelPrinting);

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