c# - propiedades - ¿Cómo obtener una instancia del Panel que contiene el contenido de ItemsControl?
propiedades tabcontrol c# (3)
Es un poco complicado ya que no sabe el nombre del Panel, por lo que no puede usar FindName, etc. Esto funcionará en la mayoría de los casos en los que esté presente un ItemsPresenter
private Panel GetItemsPanel(DependencyObject itemsControl)
{
ItemsPresenter itemsPresenter = GetVisualChild<ItemsPresenter>(itemsControl);
Panel itemsPanel = VisualTreeHelper.GetChild(itemsPresenter, 0) as Panel;
return itemsPanel;
}
Una implementación de GetVisualChild
private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
T child = default(T);
int numVisuals = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < numVisuals; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(parent, i);
child = v as T;
if (child == null)
{
child = GetVisualChild<T>(v);
}
if (child != null)
{
break;
}
}
return child;
}
Sin embargo, el ItemsPanel no siempre se usa. Vea esta respuesta por Ian Griffiths para una gran explicación.
Cada ItemsControl
tiene su contenido almacenado en el Panel ¿verdad? Podemos especificar el panel que se utilizará en XAML así:
<ListView Name="LView">
<ListView.ItemsPanel>
<ItemsPanelTemplate >
<StackPanel/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>
Mi pregunta es cómo obtener una instancia del Panel
que se usa en la propiedad ItemsPanel
(de tipo ItemsPanelTemplate
) del ItemsControl
particular. Por ejemplo, ListView
llamado LView
del ejemplo de código anterior?
No puedo usar la propiedad Name
o x:Name
, esto debe funcionar para cualquier ItemsControl
incluso para aquellos que usan el ItemsPanel
predeterminado.
En el caso no está claro, por favor comente, creo que hay una solución muy simple. Si parece ser complicado, es solo porque no puedo explicarlo correctamente.
No puedo proporcionarle el código de trabajo, pero eche un vistazo a la clase VisualTreeHelper . Con la clase VisualTreeHelper puede atravesar el árbol visual hasta su plantilla y panel.
protected Panel ItemsHost {
get {
return (Panel) typeof (MultiSelector).InvokeMember("ItemsHost",
BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance,
null, this, null);
}
}
Esto funciona como un encanto en mi ItemsControl
! Dicho esto, tiene IsItemsHost="True"
en el Panel
, pero podría funcionar sin él.
El truco es de este hilo: ¿Puedo acceder a ItemsHost de ItemsControl usando la reflexión?