2010-05-18 24 views
31

No puedo encontrar ninguna buena documentación para la propiedad adjunta Panel.IstItemsHost. Veo muchos ejemplos de personas que lo configuran en la plantilla ItemsContainer para un ItemsControl, pero la documentación no registrada en MSDN no explica por qué o qué ventajas confiere la propiedad de configuración. He creado muchos contenedores que NO configuran esta propiedad, pero que aún no han notado ningún efecto perjudicial.¿Qué hace exactamente Panel.IsItemsHost?

Respuesta

34

Digamos que tengo un ItemsControl. Quiero usar un panel personalizado que ingrese y saque elementos mientras se desplaza; se llama SwoopPanel. Ahora, ¿cómo le digo a ItemsControl que use mi SwoopPanel para contener las plantillas que crea?

La forma más rápida es para establecer el ItemsPanel en el ItemsControl:

<ItemsControl.ItemsPanel> 
    <ItemsPanelTemplate> 
     <lol:SwoopPanel /> 
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

Sin embargo, a veces que no funciona para usted. Tal vez desee personalizar cómo se presenta SwoopPanel en la interfaz de usuario, y la única forma de evitar esto es cambiar la plantilla de control de ItemsControl. Ahora puede agregar su SwoopPanel directamente a la plantilla de control y, usando la propiedad, márquelo como ItemsHost para que ItemsControl coloque todos los elementos con plantilla que crea.

<Style TargetType="ItemsControl"> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ItemsControl"> 
     <Border CornerRadius="5"> 
      <ScrollViewer VerticalScrollBarVisibility="Hidden"> 
      <lol:SwoopPanel IsItemsHost="True"/> 
      </ScrollViewer> 
     </Border> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 

¿Tienes que hacerlo de una manera u otra? No. ¿Es una más ventajosa que la otra? Bueno, la segunda forma te permite un mayor control de la IU, la primera forma es más fácil. Elige, realmente. Nunca lo hice personalmente de la segunda manera, pero creo que podría haber un par de lugares donde podría ser útil.

+0

Básicamente, el código ItemsControl tomará nota del control que se establece como IsItemsHost en su jerarquía, y si no se establece ItemsPanelTemplate, use ese elemento secundario como contenedor para los elementos secundarios generados? (Supongo que es posible que arroje si tiene una plantilla Y un elemento IsItemsHost). – Armentage

+1

IsItemsHost no es una propiedad adjunta –

+1

@kai gracias actualizada. Parece un buen candidato; se siente un poco extraño que el Panel sepa cómo se implementa ItemsControl. – Will

9

Ver http://msdn.microsoft.com/en-us/library/system.windows.controls.panel.isitemshost(v=vs.90).aspx

En esencia, lo que dice este post es que si va a reemplazar la ControlTemplate de un cuadro de lista y desea un nuevo diseño, ajuste IsItemsHost = true en el panel de algunos, por ejemplo, un StackPanel. Entonces, cualquier elemento en el ListBox se agregará automáticamente como elementos secundarios del StackPanel. Si la orientación de ListBox es Horizontal, el ListBox será horizontal.

La otra forma es establecer la propiedad ItemsPanel del ListBox en una ItemsTemplate y en esa plantilla tiene un StackPanel. En este caso, los elementos de ListBox se agregarán a los elementos secundarios de StackPanel igual que en el primer caso. Sin embargo, no necesita establecer IsItemsHost = true, no tendrá absolutamente ningún efecto. Esto se hace por usted por el hecho de que está configurando la propiedad ItemsPanel.

+1

esta es la explicación +1 – mkb

Cuestiones relacionadas