У меня есть приложение Silverlight, состоящее из нескольких диалогов, в каждом из которых есть коллекция FrameworkElement
.
Можно ли найти диалоговое окно, в котором находится элемент Framework?
У меня есть приложение Silverlight, состоящее из нескольких диалогов, в каждом из которых есть коллекция FrameworkElement
.
Можно ли найти диалоговое окно, в котором находится элемент Framework?
Вы можете использовать VisualTreeHelper
. Приведенный ниже код — это то, что я использую для поиска Page
в приложении WPF. Вы можете заменить Page любым контейнером, который вам нужен в Silverlight, например Popup
.
var parent = VisualTreeHelper.GetParent(this);
while (!(parent is Page))
{
parent = VisualTreeHelper.GetParent(parent);
}
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>();
Да, это возможно. Если вы знаете структуру своего элемента управления, вы можете использовать FrameworkElement.GetParent()
или использовать алгоритмы обхода дерева как BFS или DFS, чтобы найти элемент вашей структуры.