Ir para o conteúdo
Localizar o controle pai de um tipo específico no WPF e no Silverlight

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.

2min read

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.

WPF
Solicite uma demonstração