Ach jo, da war mal was. Nee, den LogicalTreeHelper gibt's nich in Silverlight. Laut
http://www.wpfwiki.com/WPF Q7.1.ashx
ist der aber eh nur eine Teilmenge des VisualTreeHelpers, ohne das Styling-Zeugs. Mit sichtbaren oder unsichtbaren Controls hat das aber nichts zu tun. Du solltest also alles finden.
Ich denke, das ganze ist recht unintuitiv und umständlich wegen dem Konzept von XAML. In so ein XAML kann man alle möglichen Objekte reinkippen, nicht nur Controls. Objekte, die keine Controls sind, werden als Text dargestellt, der bei .ToString() rauskommt.
Daher kann es Objekte geben, die der VisualTreeHelper als Child nicht anerkennt. Ich bin mir auch gar nicht so sicher, ob z.B. der Content eines ContentControls oder ContentPresenter (vielleicht gibt's auch weitere) denn ein Child ist. In dem Fall müsstest du den Code folgendermaßen erweitern:
public static void ForEachControlRecursive(object root, Action<Control> action)
{
Control control = root as Control;
if (control != null)
{
action(control);
}
ContentPresenter cp = root as ContentPresenter;
if (cp != null)
{
ForEachControlRecursive(cp.Content, action);
return;
}
ContentControl cc = root as ContentControl;
if (cc != null)
{
ForEachControlRecursive(cc.Content, action);
return;
}
// evtl. gibt's noch mehr so'n Mist
DependencyObject dpo = root as DependencyObject;
if (dpo != null)
{
for (int n = 0; n < VisualTreeHelper.GetChildrenCount(dpo); n++)
{
ForEachControlRecursive(VisualTreeHelper.GetChild(dpo, n), action);
}
}
Vielleicht ist dein Problem auch einfacher. Es ist nicht alles ein Control. Von Control ist nur alles abgeleitet, womit der Benutzer irgendwie interagieren kann. Ein Panel z.B. ist kein Control, sondern ist von FrameworkElement abgeleitet. Versuche also in dem Fall also, deine Action auf Action<FrameworkElement> o.ä. zu erweitern.
vor 11 Monate veröffentlicht
#