如何按类类型访问对象?

时间:2019-07-10 11:19:33

标签: c# wpf

我正在开发WPF应用程序。在我的应用程序中,我想按类类型访问对象。

我尝试了以下代码块。

  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 (Storyboard sb in FindVisualChildren<Storyboard>(window))
{
     // There is no accessable storyboard object
}

我可以访问Control对象,但不能访问非UIElement对象。例如:我可以找到RadioButton,但是找不到Storyboard个对象。

1 个答案:

答案 0 :(得分:2)

如评论中所述,Storyboard不是添加到视觉树的视觉元素,因此VisualTreeHelper将无法找到它。

但是您可以将所有Storyboards添加到窗口的Resources字典中并遍历资源:

Storyboard sb1 = new Storyboard();
Storyboard sb2 = new Storyboard();
...
Resources.Add("sb1", sb1);
Resources.Add("sb2", sb2);
...
foreach (Storyboard sb in Resources.Values.OfType<Storyboard>())
{
    ...
}