Как найти диалоговое окно, в котором живет Silverlight FrameworkElement?

У меня есть приложение Silverlight, состоящее из нескольких диалогов, в каждом из которых есть коллекция FrameworkElement.

Можно ли найти диалоговое окно, в котором находится элемент Framework?


person meds    schedule 21.12.2011    source источник


Ответы (3)


Вы можете использовать VisualTreeHelper. Приведенный ниже код — это то, что я использую для поиска Page в приложении WPF. Вы можете заменить Page любым контейнером, который вам нужен в Silverlight, например Popup.

var parent = VisualTreeHelper.GetParent(this);
    while (!(parent is Page))
    {
        parent = VisualTreeHelper.GetParent(parent);
    }
person Tomislav Markovski    schedule 21.12.2011

http://forums.silverlight.net/p/55369/142519.aspx имеет метод, упрощающий приведенный выше пример кода и делающий его универсальным:

public static class ControlFinder
{
    public static T FindParent<T>(this UIElement control) where T: UIElement
    {
        UIElement p = VisualTreeHelper.GetParent(control) as UIElement;
        if (p != null)
        {
            if (p is T)
                return p as T;
            else
                return ControlFinder.FindParent<T>(p);
        }
        return null;
    }
}

Используйте это как:

var page = myElement.FindParent<Page>();
person Tim S.    schedule 21.12.2011

Да, это возможно. Если вы знаете структуру своего элемента управления, вы можете использовать FrameworkElement.GetParent() или использовать алгоритмы обхода дерева как BFS или DFS, чтобы найти элемент вашей структуры.

person Ross Brigoli    schedule 21.12.2011