2010-11-15 20 views
7

Tengo una aplicación con múltiples controles ListView donde hay un requisito de que el elemento en el ListView debe ser completamente visible. Nunca debe haber elementos de ListViewItem parciales en la lista. Si el usuario suelta el ScrollViewer en una posición que termina mostrando un elemento parcial, entonces la lista debe "ajustarse" y corregirse a sí misma para que solo se muestren los elementos completos.WPF ListView Mostrar siempre los elementos completos

¿Alguien ha hecho esto antes? Creo que voy a necesitar sobrecargar ListView y/o ScrollViewer para hacer esto. Estoy buscando sugerencias sobre cómo abordar esto. Gracias.

He aquí una de mis listas:

<ctrls:SnapList x:Name="PART_ProductList" 
              ScrollViewer.CanContentScroll="False" 
              ScrollViewer.VerticalScrollBarVisibility="Auto" 
              ScrollViewer.HorizontalScrollBarVisibility="Hidden" 
              ItemContainerStyle="{StaticResource ProductFinderItem}" 
              Canvas.Top="373" Canvas.Left="75" 
              Height="910" Width="900" > 

          <ctrls:SnapList.ItemsPanel> 
            <ItemsPanelTemplate> 
             <VirtualizingStackPanel VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard" /> 
           </ItemsPanelTemplate> 
          </ctrls:SnapList.ItemsPanel> 

          <ctrls:SnapList.Template> 
            <ControlTemplate> 
            <ScrollViewer x:Name="Scroller" VerticalAlignment="Top" CanContentScroll="True" Style="{StaticResource VertScrollViewer}" Focusable="false" > 
               <ItemsPresenter /> 
              </ScrollViewer> 
            </ControlTemplate> 
          </ctrls:SnapList.Template> 
         </ctrls:SnapList> 
+0

¿De qué ScrollViewer está hablando? ¿Tiene un ScrollViewer en una Grilla (o algo) que contiene múltiples ListViews y cuando ese ScrollViewer cambia de posición, entonces quiere asegurarse de que todos los ListViewItems estén visibles? Para un ListView en sí mismo, ni siquiera puedo obtener que muestre elementos parciales. –

+0

Estoy hablando del ScrollViewer en ControlTemplate de la lista. Agregué el xaml para una de las listas a mi publicación. El ScrollViewer del que hablo es el que tiene x: Name = "Scroller" en el ejemplo XAML. –

+0

* ListBox * tiene exactamente el mismo comportamiento por defecto. ¿Se puede usar un * ListBox * en lugar de un * ListView *? – decyclone

Respuesta

0

¿Ha intentado ListView.ScrollIntoView?

+0

ScrollIntoView desplazará un elemento a la vista, pero no hace nada para garantizar que solo se vean elementos completos en una lista. Incluso si lo hiciera, todavía necesitaría saber cuándo llamarlo (por ejemplo, cuando se muestran elementos parciales). –

+0

Su pregunta actual es más clara. Anteriormente, era más como si quisieras que tu selección fuera completamente visible. En cambio, no quiere que se muestren elementos parciales en su lista. ¿Derecha? – Yogesh

+0

Derecha. Mi pregunta es la misma que originalmente publiqué. :) –

1

Creo que usted está buscando la ScrollViewer.CanContentScroll Propiedad

Si conoce el tamaño máximo del elemento en el ListView, asegúrese de que la altura del ListView es el mismo tamaño, o un múltiplo de la altura del artículo.

Ejemplo de trabajo:

<ListView ScrollViewer.CanContentScroll="True" 
      Height="200"> 

    <ListBoxItem Height="50" 
        Content="Test1" /> 
    <ListBoxItem Height="50" 
        Content="Test2" /> 
    <ListBoxItem Height="50" 
        Content="Test3" /> 
    <ListBoxItem Height="50" 
        Content="Test4" /> 
    <ListBoxItem Height="50" 
        Content="Test5" /> 
    <ListBoxItem Height="50" 
        Content="Test6" /> 
    <ListBoxItem Height="50" 
        Content="Test7" /> 
    <ListBoxItem Height="50" 
        Content="Test8" /> 
    <ListBoxItem Height="50" 
        Content="Test9" /> 
    <ListBoxItem Height="50" 
        Content="Test10" /> 

</ListView> 

contenido en un ScrollViewer se puede desplazar en términos de unidades físicas o unidades lógicas. Las unidades físicas son píxeles independientes del dispositivo. Las unidades lógicas se utilizan para desplazar elementos dentro de ItemsControl. El comportamiento predeterminado de del ScrollViewer es utilizar unidades físicas en desplazarse por su contenido. Sin embargo, en los casos en que CanContentScroll es establecido en verdadero, el contenido podría usar unidades lógicas para desplazarse. Para el ejemplo , ListBox, ListView y otros controles que heredan de ItemsControl usan unidades lógicas para desplazarse. Si CanContentScroll es verdadero, los valores de las propiedades ExtentHeight, ScrollableHeight, ViewportHeight y VerticalOffset son el número de elementos, en lugar de las unidades físicas .

Si necesita desplazamiento físico en lugar de desplazamiento lógico, ajuste el elemento del Panel de sistema principal en un ScrollViewer y establezca su propiedad CanContentScroll en false. El desplazamiento físico es el comportamiento de desplazamiento predeterminado para la mayoría de los elementos del panel.

Cuestiones relacionadas