2011-07-07 7 views
5

Hay varias preguntas relacionadas con ScrollViewer que he investigado, pero ninguna de ellas me ha funcionado. Esto casi con seguridad se debe a mi falta de comprensión con respecto al tamaño de un elemento. En primer lugar, mi XAML (que no sea la definición control de usuario, esto es todo el control):Incrustar un control de elementos en un ScrollViewer

<DockPanel Width="Auto"> 
      <ScrollViewer DockPanel.Dock="Top" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" CanContentScroll="True" BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,1,1,1" Background="{DynamicResource LightGradientBackgroundBrush}"> 
      <ItemsControl Focusable="false" Width="Auto" MinHeight="30" ItemsSource="{Binding RequiredFields}" OverridesDefaultStyle="False"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <DockPanel /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Grid Margin="3,0,3,3"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="110"/> 
           <ColumnDefinition Width="*"/> 
          </Grid.ColumnDefinitions> 
          <Label Content="{Binding Path=Header, Mode=OneTime}" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="0"/> 
          <TextBox Text="{Binding Path=Value}" HorizontalAlignment="Stretch" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="1"/> 
         </Grid> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </ScrollViewer> 
     </DockPanel> 

Este control se carga dentro de una pestaña como el contenido. La ventana que aloja la pestaña es redimensionable, y el tamaño mínimo del contenido de la pestaña es 60. Lo que intento hacer es hacer que el desplazador de desplazamiento llene la pestaña, pero no empuje la pestaña más allá de los límites de la ventana. Con el XAML anterior, el contenido excedente da como resultado la expansión de la altura de la pestaña y aparece una barra de desplazamiento en la ventana, no en la pestaña.

El scrollviewer se está expandiendo al tamaño de sus elementos secundarios, por lo tanto, empuja la altura de la pestaña hacia afuera. Lo que quiero es que el scrollviewer se fije al tamaño de la pestaña y que el contenido dentro del scrollviewer crezca dentro de los límites del scrollviewer, de modo que se presente una barra de desplazamiento cuando haya demasiado contenido.

¿Dónde me estoy equivocando?

Editar:

El problema es la altura, no el ancho. El ancho se está comportando como debería. Cambié el contenedor a una grilla como se sugirió, pero a menos que establezca la propiedad Height, la grilla se expande para ajustarse al contenido del scrollviewer expandido, causando el mismo problema que antes.

XAML Actualizado:

<Grid MinHeight="60" VerticalAlignment="Top"> 
     <Border BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,1,1,1"> 
     <ScrollViewer 
      HorizontalScrollBarVisibility="Auto" 
      VerticalScrollBarVisibility="Visible" 
      CanContentScroll="True" 
      BorderBrush="{DynamicResource PanelBorder}" 
      BorderThickness="1,1,1,1" 
      Background="{DynamicResource LightGradientBackgroundBrush}" 
      > 
      <ItemsControl Focusable="false" Width="Auto" MinHeight="30" ItemsSource="{Binding RequiredFields}" OverridesDefaultStyle="False"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel Orientation="Vertical" /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <Grid Margin="3,0,3,3"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="110"/> 
           <ColumnDefinition Width="*"/> 
          </Grid.ColumnDefinitions> 
          <Label Content="{Binding Path=Header, Mode=OneTime}" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="0"/> 
          <TextBox Text="{Binding Path=Value}" HorizontalAlignment="Stretch" Foreground="{DynamicResource SilverBorderColorBrush}" Grid.Column="1"/> 
         </Grid> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
       <ItemsControl.ItemContainerStyle> 
        <Style> 
         <Setter Property="DockPanel.Dock" Value="Top"/> 
        </Style> 
       </ItemsControl.ItemContainerStyle> 
      </ItemsControl> 
     </ScrollViewer> 
     </Border> 
    </Grid> 

Ninguna de las respuestas a continuación han ayudado a hacer este trabajo, pero estoy bastante seguro de que las respuestas trabajarían en la mayoría de los casos.

Mi control se aloja dentro de una página de pestañas. Se carga dinámicamente y no tengo control sobre cómo está diseñada la página de pestañas. Mi intuición es que el control de pestañas permite tanto espacio como el contenido dentro de él. Debido a que la grilla en mi control dice usar todo el espacio disponible, y la página de pestañas ofrece tanto espacio como el contenedor hijo necesita, y el control de elementos está tratando de usar todo el espacio que ofrece la grilla; culmina en la expansión de la pestaña que contiene todo el contenido de ItemsControl.

Si la página de pestañas se creó para que no se expanda y se ajuste a su contenido, las siguientes soluciones funcionarían. Lamentablemente, no creo que este sea el caso.

Todo un día perdido en esto. Tiempo de seguir adelante.

Respuesta

6

Ah sí las complejidades de diseño de WPF es un dolor a veces. Lo que te está matando es la combinación de DockPanel y Width = "Auto" en ItemsControl. DockPanel les dice a sus hijos que pueden tener todo el espacio que deseen para el diseño. Your ItemsControl le dice a sus hijos lo mismo. Al final, la ventana crea un ScrollViewer para manejar el contenido de gran tamaño.

Reemplace el DockPanel externo con una rejilla y todo debería estar bien.

+0

Gracias @Mike. Si utilizo un control de cuadrícula como envoltorio y establezco una altura fija, funciona como se anuncia. Sin embargo, si la ventana se expande, hay un montón de espacio vacío en la parte superior/inferior. Quiero que la grilla se expanda con su padre, pero restrinja a sus hijos (verticalmente). Por lo tanto, prefiero no establecer una altura fija. Si no lo hago, se produce el mismo comportamiento incorrecto. –

+0

Lo siento, quise decirle que cree una definición de columna y fila y establezca el ancho y el alto respectivamente en *. Eso debería lograr lo que quieres. –

+0

Esto tampoco me funcionó, pero creo que descubrí por qué. Voy a editar mi pregunta con lo que pienso, por lo que esta pregunta no es una pérdida de tiempo total. Gracias por tu ayuda. –

1

Tener ScrollViewer no a la fuerza, tiene que utilizar la red de contenedores

<Grid>    
<ScrollViewer DockPanel.Dock="Top" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Visible" CanContentScroll="True" BorderBrush="{DynamicResource PanelBorder}" BorderThickness="1,1,1,1" Background="{DynamicResource LightGradientBackgroundBrush}"> 
... 
</ScrollViewer>   
</Grid> 

DockPanel y StackPanel siempre ajustarse perfectamente al cuerpo que es niños

También se fijan en esta nota (que he copiado de here)

Panel X dimensión Y Dimensión

lona No No

Muelle Sí Sí

StackPanel (vertical) Sí No

StackPanel (horizontal) No Sí

cuadrícula Sí * Sí *

WrapPanel No No

  • Excepto cuando se usan filas y columnas "automáticas"

Sí en el cuadro anterior significa "Los niños se estiran hasta disponible"

n en la tabla anterior significa "Los niños son su tamaño deseado"

Cuestiones relacionadas