Localizar o controle pai de um tipo específico no WPF e no Silverlight
Eu sei que este não é um truque secreto inovador e alucinante, mas tenho recebido um número surpreendente de perguntas sobre como encontrar o pai de um tipo específico para um controle.
A capacidade de encontrar um controle pai com base em um tipo é muito útil ao compor exibições dinamicamente, como em um aplicativo Prism. Existem vários outros cenários em que isso é útil, mas a solicitação mais recente para isso foi baseada na minha postagem do XamDockManager Prism Region Adapter. Alguém queria criar um comportamento que seria anexado à sua exibição, que é injetado em um ContentPane, para controlar se o ContentPane poderia ser fechado ou não. Bem, como o evento Closing cancelável existe no próprio controle ContentPane e não no View que estava sendo injetado, eles precisavam acessar o pai do tipo ContentPane de dentro do comportamento. Bem, para a sorte deles, isso é muito fácil de fazer.
public static T FindParent<T>(DependencyObject child) where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
T parent = parentObject as T;
if (parent != null)
return parent;
else
return FindParent<T>(parentObject);
}
Esse snippet de código simples percorrerá a árvore visual do controle procurando um controle pai que corresponda ao tipo específico fornecido. Para usá-lo, basta chamar o método FindParent<T>, em que T é o tipo que você está procurando e, em seguida, passar o controle no qual você deseja para o pai de.
ContentPane _parentContentPane = FindParent<ContentPane>(this);
if (_parentContentPane != null)
_parentContentPane.Closing += _parentContentPane_Closing;
Este exemplo específico pesquisa a árvore visual de um controle de usuário procurando o xamDockManager ContentPane que contém a instância de controle de usuário. Ah, e eu mencionei que esse trecho de código exato funcionará da mesma forma no WPF e no Silverlight? Isso foi fácil!
Sinta-se à vontade para entrar em contato comigo no meu blog, conecte-se comigo no Twitter (@brianlagunas) ou deixe um comentário abaixo para quaisquer perguntas ou comentários que possa ter.