2009-11-30 12 views
7

Esta pregunta es igual a esta otra unanswered question.ListView con expansor anidado sin colapsar

Cuando el expansor se expande el ListView exterior crece para hacer espacio para el contenido expansores, pero cuando el expansor continuación, se colapsa la vista no forzar el ListView para cambiar el tamaño.

código reducido, con notas después:

<!--<StackPanel>--> 
<ItemsControl> 

    <!-- ParameterGroupView --> 
    <Border BorderBrush="Brown" BorderThickness="1" CornerRadius="4" Padding="4"> 
    <ListView HorizontalContentAlignment="Stretch"> 
     <Expander Header="Expander A" IsExpanded="False"> 
     <ListView HorizontalContentAlignment="Stretch"> 

      <!-- TextView --> 
      <TextBlock >Content A</TextBlock> 
      <TextBlock >Content B</TextBlock> 

     </ListView> 
     </Expander> 

    </ListView> 
    </Border> 

</ItemsControl> 
<!--</StackPanel>--> 

Tengo el ParameterGroupView en un ItemsControl o StackPanel porque en realidad hay muchos ParameterGroupView entradas. El intercambio a StackPanel no cambia el comportamiento.

Extracción de la Boarder no afecta al comportamiento, pero tener que ayuda a mostrar el comportamiento con un solo ParameterGroupView.

Puede haber muchas Expander secciones en el exterior ListView y la Expander puede tener muchas entidades dentro del interior ListView.

El exterior ListView y Expander es reemplazar un TreeView, que se utilizó para tener una lista de nodos plegables, pero el TreeView 's uso interno de las redes, los medios de artículos TextView fueron aplastados horizonatlly, lo mismo que si elimina ether HorizontalContentAlignment = "Stretch" atributos.

Así que si hay otra manera de envolver/cablear todo esto, también estaré contento.

Esto es un problema porque nuestras TextView bloques son grandes y hay muchos Expander s.

Editar: TextView se usa como el código está enlazado a datos y, por lo tanto, se ensambla de forma dinámica. Por lo que cualquier sustituto de ListView necesitaría algún tipo de ItemsSource

+0

Tampoco quería ninguna interacción del estilo ListView con los elementos de contenido. Realmente solo quería un control de cambio de tamaño dinámico que también podría estar vinculado. –

Respuesta

4

Encontré la solución y detalla en qué parte de la pregunta ya está.

ItemControl acepta una ItemsSource y cambia de tamaño automático. Así que reemplazando los dos ListView s con ItemControl s obtiene el colapso anidado.

Pero no hay movimiento en sentido vertical, de modo que envuelve el exterior ItemControl con un ScrollViewer, reproduce el efecto deseado completa.

<ScrollViewer 
    VerticalScrollBarVisibility="Auto"> 
    <ItemsControl> 
     <!-- ParameterGroupView --> 
     <Border 
      BorderBrush="Brown" 
      BorderThickness="1" 
      CornerRadius="4" 
      Padding="4" 
      Height="Auto"> 
      <ItemsControl 
       HorizontalContentAlignment="Stretch"> 
       <Expander 
        Header="Expander A" 
        IsExpanded="False"> 
        <ItemsControl 
         HorizontalContentAlignment="Stretch"> 
         <!-- TextView --> 
         <TextBlock>Content A</TextBlock> 
         <TextBlock>Content B</TextBlock> 
        </ItemsControl> 
       </Expander> 
      </ItemsControl> 
     </Border> 
    </ItemsControl> 
</ScrollViewer> 

Estaba probando con dobles expansores en la frontera y secciones dobles de borde.

+0

Acabo de probar esto en la aplicación real, y esto resuelve el problema allí también. –

2

La primera cosa que puede hacer aquí es poner los expansores en un recipiente que no sea una vista de lista:

<Border BorderBrush="Brown" BorderThickness="1" CornerRadius="4" Padding="4"> 
    <StackPanel> 

     <Expander Header="Expander A" IsExpanded="False"> 
      <ListView HorizontalContentAlignment="Stretch" MinWidth="100"> 
       <ListBox Name="listb"></ListBox> 

       <!-- TextView --> 
       <TextBlock >Content A</TextBlock> 
       <TextBlock>Content B</TextBlock> 

      </ListView> 
     </Expander> 
    </StackPanel> 
</Border> 

El contenedor cambia de tamaño en torno a contenidos solo multa.

Si absolutamente debe tenerlo en un ListView (que es posible), entonces no sé de una manera de obtener un ListView para cambiar el tamaño fácilmente una vez que ha crecido (más allá de establecer tamaños explícitos de todo, lo que es torpe y no es útil).Si ese es el caso, entonces es posible que tengas que usar un cuadro de lista controlable para mostrar todos los expansores abiertos, o mostrar el contenido de una manera diferente (como en una ventana emergente, ¿no?) Si quieres poder verlo todo de un vistazo.

+0

Sí, estoy de acuerdo en que el ListBox tiene la culpa, pero lo necesito, o algo así, ya que admite ItemsSource, donde, como no lo hace StackPanel. Mi sistema real está completo de datos enlazados, no estático. –

Cuestiones relacionadas