Pergunta

Estou procurando um método confiável para construir uma lista de controles deu003CType> contido em um específicou003CPanel> Controle derivado - isso inclui aqueles que são crianças diretas e aquelas que são crianças de crianças e assim por diante.

A maneira mais óbvia era apenas fazê -lo recursivamente:
Adicionar para listar qualquer criança deste controle deu003CType> , depois repita a função para qualquer filho desse controle que é umu003CPanel> ou descendente.

No entanto, estou preocupado que isso não encontre todos os controles na árvore - qualquer conteúdo também pode conter um controle deu003CType> , como poderia o cabeçalho ContontentControl ou qualquer outro controle semelhante com um ou mais atributos de criança/conteúdo.

Existe algum meio de executar uma pesquisa contra a árvore de layout real, de modo que algum A instância de um tipo específico de controle contido sem um pai específico pode ser encontrado?

Foi útil?

Solução

Aqui está um método de extensão bastante ingênuo:-

public static class VisualTreeEnumeration
{
   public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
   {
     int count = VisualTreeHelper.GetChildrenCount(root);
     for (int i=0; i < count; i++)
     {
       var child = VisualTreeHelper.GetChild(root, i);
       yield return child;
       foreach (var descendent in Descendents(child))
         yield return descendent;
     }
   }
}

Essa abordagem tem a devolução de que não assume que não ocorram mudanças na associação à árvore enquanto estão em andamento. Isso pode ser mitigado em uso usando um tolista ().

Agora você pode afetar seus requisitos usando o LINQ:-

 var qryAllButtons = myPanel.Descendents().OfType<Button>();

Outras dicas

Digamos que você queira encontrar ComboBoxes dentro de um UserControl que comece com uma grade e tenha grades aninhadas, Stackpanels, lona etc. contendo ComboBoxes

  1. Imports System.Windows.Controls.Primitives (ou usando para C#)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

É isso...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top