2011-05-18 23 views
5

en nuestra aplicación, tenemos algunos ListViews y ListBox dentro de cuadrículas donde puede cambiar la altura real del control con la ayuda de un divisor de cuadrícula. Al hacerlo, puede organizar la altura del ListBox para que uno de los elementos no sea completamente visible porque el ListView se pone corto para mostrarlo.Evite que WPF ListView o ListBox muestren elementos "medios"

Este es un comportamiento que no queremos.

De mi investigación hasta el momento parece que no hay manera de evitar que ListBox o ListView muestren elementos parciales, pero quizás alguien haya encontrado otra forma de resolver este problema. Tal vez el objeto se active solo cuando solo sea visible a medias. Pero, ¿cómo podemos averiguarlo?

Estamos abiertos a cualquier sugerencia.

+0

¿Por qué quiere evitar la visualización de elementos parciales? Siempre que la lista sea desplazable, este es un gran indicador para las personas sobre las que se puede desplazar el contenido. –

Respuesta

1

No hay forma de que sepa arreglar un ListView de esta manera. Sin embargo, para ListBox, puede anular ArrangeOverride y organizar los elementos usted mismo. Apila los elementos que deseas ver y organiza los elementos que no deseas que sean visibles (por ejemplo, elementos parcialmente visibles) para que no sean visibles. Por ejemplo, una versión no virtualizado:

/// <summary> 
    /// Used to arrange all of the child items for the layout. 
    /// Determines position for each child. 
    /// </summary> 
    /// <param name="finalSize">Parent passes this size in</param> 
    /// <returns>Parent size (always uses all of the allowed area)</returns> 
    protected override Size ArrangeOverride(Size finalSize) 
    { 
     // Arrange in a stack 
     double curX = 0; 
     double curY = 0; 
     foreach (UIElement child in InternalChildren) 
     { 
      double nextY = curY + child.DesiredSize.Height; 
      if (nextY > finalSize.Height)   // Don't display partial items 
       child.Arrange(new Rect()); 
      else 
       child.Arrange(new Rect(curX, curY, child.DesiredSize.Width, child.DesiredSize.Height); 
      curY = nextY; 
     } 

     return finalSize; 
    } 
0

Sólo tiene que establecer MinHeight o MinWidth a la célula que you'r cambio de tamaño. Pruebe esto:

<Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition MinHeight="50"/> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition MinHeight="50"/> 
     </Grid.RowDefinitions> 
     <ListBox HorizontalAlignment="Center" Margin="10"> 
      <ListBoxItem>First</ListBoxItem> 
      <ListBoxItem>Second</ListBoxItem> 
      <ListBoxItem>Third</ListBoxItem> 
      <ListBoxItem>Fourth</ListBoxItem> 
     </ListBox> 
     <GridSplitter Grid.Row="1" Height="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
     <ListView Grid.Row="2" Margin="4"> 
      <ListViewItem>First</ListViewItem> 
      <ListViewItem>Second</ListViewItem> 
      <ListViewItem>Third</ListViewItem> 
      <ListViewItem>Fourth</ListViewItem> 
     </ListView> 
    </Grid>