2010-11-11 7 views
5

Tengo una pregunta sobre el diseño con una vista de lista dentro de un scrollviewer. Una vez que una vista de lista está dentro de un visualizador de desplazamiento, usa su tamaño máximo y no se desplaza porque el scrollviewer ofrece una cantidad de espacio ilimitada para los controles que están dentro de él. El problema es que los controles que están debajo de una larga lista solo son visibles si el usuario se desplaza hacia abajo y quiero que la vista de lista use solo el espacio que sea necesario y use una barra de desplazamiento. Las imágenes dicen más información que las palabras (los enlaces para las imágenes también dicen mucho ya que mi reputación aún no está en 10. Edit2: bueno, puedo usar un solo enlace, así que copié todas las imágenes en una). Si las listas no es larga todo está bien:WPF: ListView dentro de Scrollviewer; Pregunta de diseño

Imagen 1: http://i.stack.imgur.com/7dDEC.jpg

Ahora bien, si la lista es más larga por debajo de los controles de movimiento hacia abajo en la tierra invisible:

Foto 2: ver enlace de foto 1

Lo que yo quiero pasar ahora es la siguiente:

imagen 3: véase el enlace de la imagen 1

Eso en sí mismo no es realmente un problema porque podríamos poner todo en un dockpanal y acoplar los controles a continuación en Dock.Below y Top to Top y dejar que la vista de lista llene el centro con "lastchildfill". Ahora para el problema real. ¿Qué pasa si la ventana se hace más pequeña? Luego, al principio, la vista de lista desaparece y luego también todo lo demás sin tener una barra de desplazamiento para desplazarse a los controles en la parte inferior.

Imagen 4: ver enlace de cuadro 1

La solución ideal Estoy buscando es tener barras de desplazamiento en la ventana (o una ScrollViewer raíz), que nos permitan desplazarse a cada sección de la ventana de esta manera y solo tiene las barras de desplazamiento externas para ser visibles una vez que todo es un tamaño mínimo.

Imagen 5: ver enlace de cuadro 1

alguna idea? demasiadas fotos? aquí hay un poco de XAML para todo el mundo para tratar de hacer que funcione (que es sólo un rápido ejemplo, ventanas ...)

<Window x:Class="WpfTest1.ScrollTestWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
Title="ScrollTestWindow" Height="400" Width="700"> 
    <ScrollViewer > 
     <DockPanel LastChildFill="True" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible"> 
      <Grid DockPanel.Dock="Top"> 
       <TextBlock Text="Example controls above listview" Background="LightGray" FontSize="30"></TextBlock> 
      </Grid> 
      <Grid DockPanel.Dock="Bottom"> 
       <TextBlock Text="Example controls below listview" Background="LightGray" FontSize="30"></TextBlock> 
      </Grid> 
      <ListView FontSize="30"> 
       <ListView.View> 
        <GridView> 
         <GridViewColumn Width="190" Header="Date" /> 
         <GridViewColumn Width="200" Header="Day Of Week" DisplayMemberBinding="{Binding DayOfWeek}" /> 
         <GridViewColumn Width="120" Header="Year" DisplayMemberBinding="{Binding Year}" /> 
        </GridView> 
       </ListView.View> 
       <sys:DateTime>1/1/1</sys:DateTime> 
       <sys:DateTime>1/1/1</sys:DateTime> 
       <sys:DateTime>1/1/1</sys:DateTime> 
       <sys:DateTime>1/1/1</sys:DateTime> 
       <sys:DateTime>1/1/1</sys:DateTime> 
       <sys:DateTime>1/1/1</sys:DateTime> 
       <sys:DateTime>1/1/1</sys:DateTime> 
       <sys:DateTime>1/1/1</sys:DateTime> 
      </ListView> 
     </DockPanel> 

    </ScrollViewer> 

Respuesta

4

Ok. Entonces tuve el mismo problema, ¡pero ahora he logrado resolverlo!

Mi proyecto se ve un poco diferente al suyo, pero creo que debería funcionar para usted. La solución que presento también tiene algunas limitaciones. Por ejemplo, solo funcionará si solo agrega un ListView! En tu ejemplo, solo tienes uno, entonces eso no será un problema allí.Pero para cualquiera que desee más ListViews, tendrá que agregar más funcionalidades para decidir los tamaños de las Vistas y dónde ubicarlas.

También tendrá que tener un MinHeight configurado para el ListView.

Mi solución es crear su propia clase panel que se extiende un StackPanel , anular el MeasureOverride y los ArrangeOverride funciones. Y añadir la ListView en el panel creado

CustomPanel:

public class ScrollablePanel : StackPanel 
{ 
    protected override Size MeasureOverride(Size constraint) 
    { 
     Size tmpSize = base.MeasureOverride(constraint); 
     tmpSize.Height = (double)(this.Children[0] as UIElement).GetValue(MinHeightProperty); 
     return tmpSize; 
    } 

    protected override System.Windows.Size ArrangeOverride(System.Windows.Size finalSize) 
    { 
     Size tmpSize = new Size(0, 0); 

     //Width stays the same 
     tmpSize.Width = finalSize.Width; 

     //Height is changed 
     tmpSize.Height = finalSize.Height; 

     //This works only for one child! 
     this.Children[0].SetCurrentValue(HeightProperty, tmpSize.Height); 
     this.Children[0].Arrange(new Rect(new Point(0, 0), tmpSize)); 

     return tmpSize; 
    } 
} 

El XAML

<Window x:Class="WpfTest1.ScrollTestWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:sys="clr-namespace:System;assembly=mscorlib" 
xmlns:local="clr-namespace:WpfTest1" 
Title="ScrollTestWindow" Height="400" Width="700"> 
    <ScrollViewer > 
     <DockPanel LastChildFill="True" ScrollViewer.CanContentScroll="True" ScrollViewer.HorizontalScrollBarVisibility="Visible"> 
      <Grid DockPanel.Dock="Top"> 
       <TextBlock Text="Example controls above listview" Background="LightGray" FontSize="30"></TextBlock> 
      </Grid> 
      <Grid DockPanel.Dock="Bottom"> 
       <TextBlock Text="Example controls below listview" Background="LightGray" FontSize="30"></TextBlock> 
      </Grid> 
      <local:ScrollablePanel> 
       <ListView FontSize="30" MinHeight="80"> 
        <ListView.View> 
         <GridView> 
          <GridViewColumn Width="190" Header="Date" /> 
          <GridViewColumn Width="200" Header="Day Of Week" DisplayMemberBinding="{Binding DayOfWeek}" /> 
          <GridViewColumn Width="120" Header="Year" DisplayMemberBinding="{Binding Year}" /> 
         </GridView> 
        </ListView.View> 
        <sys:DateTime>1/1/1</sys:DateTime> 
        <sys:DateTime>1/1/1</sys:DateTime> 
        <sys:DateTime>1/1/1</sys:DateTime> 
        <sys:DateTime>1/1/1</sys:DateTime> 
        <sys:DateTime>1/1/1</sys:DateTime> 
        <sys:DateTime>1/1/1</sys:DateTime> 
        <sys:DateTime>1/1/1</sys:DateTime> 
        <sys:DateTime>1/1/1</sys:DateTime> 
       </ListView> 
      </local:ScrollablePanel> 
     </DockPanel> 

    </ScrollViewer> 
</Window> 

Fue hace mucho tiempo se hizo esta pregunta, pero espero ¡Esta respuesta ayudará al menos a alguien!

También me gustaría dar las gracias @sisyphe por toda la ayuda necesaria para resolver este problema :)

3

No estoy seguro si esto es realmente la solución ideal, pero yo personalmente hacer esto bastante diferente:

Utilizo una cuadrícula simple, con n filas para lo que debe estar por encima de la listave, m filas para el material a continuación y una fila para la vista de lista con altura = *. Entonces, todo lo que está arriba y abajo es visible, aparece una barra de desplazamiento en la vista de lista cuando no hay espacio suficiente.

Tengo un ejemplo de esto, pero con un DataGrid. Debería ser bastante similar con un ListView.

+0

que hace la imagen no.3 partido, ¿verdad? ¿No tiene el mismo problema que en la imagen no.4 cuando su ventana se pone realmente pequeña? – Jan

+1

Sí, configure un MinHeight en la ventana si desea evitar esto. Pero, generalmente, esto queda a discreción del usuario. No creo que pueda hacer mucho en tal caso y no creo que muchos usuarios quieran cambiar el tamaño de la ventana a una altura tan pequeña. – Timores

+0

voy a marcar esto como una respuesta a pesar de que es algo así como "simplemente no dejes que la ventana se ponga tan pequeña". ¿Alguna idea diferente? – Jan