Silverlight: Encontre todos os controles do tipo no layout
-
21-09-2019 - |
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?
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
Imports System.Windows.Controls.Primitives
(ou usando para C#)Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)
É isso...