que propiedades eventos definicion container c# .net wpf controls custom-controls

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?