2010-12-23 10 views
20

Tengo un ItemsControl en mi control de usuario con un visor de desplazamiento para cuando se vuelve demasiado grande (demasiado grande porque el contenido es mayor que el área visible UserControl). El problema es que la cuadrícula en la que está todo se expande para que el visor de desplazamiento nunca entre (a menos que especifique una altura exacta para la cuadrícula). Ver el código a continuación y gracias de antemano.Evitar que el control WPF se expanda más allá del área visible

<UserControl x:Class="BusinessObjectCreationWizard.View.TableSelectionPageView" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <GroupBox FontWeight="Bold" Height="300px" 
       Header="Tables" 
       Padding="2"> 

     <ScrollViewer> 

      <ItemsControl FontWeight="Normal" 
          ItemsSource="{Binding Path=AvailableTables}"> 
       <ItemsControl.ItemTemplate> 

        <DataTemplate>    
         <CheckBox Content="{Binding Path=DisplayName}" 
            IsChecked="{Binding Path=IsSelected}" 
            Margin="2,3.5" /> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
</UserControl> 

Este control de usuario se carga aquí

<Border Background="White" Grid.Column="1" Grid.Row="0"> 
     <HeaderedContentControl Content="{Binding Path=CurrentPage}" 
           Header="{Binding Path=CurrentPage.DisplayName}" /> 
</Border> 

me gustaría no especificar la altura.

+0

La expansión de la Grilla depende de lo que contenga. Necesita mostrar más de su XAML para obtener una respuesta precisa. –

+0

Agregué código adicional (aunque el formateo resultó extraño) –

Respuesta

25

Si elimina la Altura de su GroupBox (que, por lo que yo entiendo, es lo que desea hacer), entonces llenará su contenedor, a menos que exista un panel en sentido ascendente que imponga sus propias reglas de tamaño.

Utilicé esta versión simplificada de su XAML. Eliminé la plantilla y el encuadernado, y codifiqué algunos elementos, para hacer esto solo; esos cambios no afectarán la forma en que se realiza el diseño.

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
     <ScrollViewer> 
      <ItemsControl FontWeight="Normal"> 
       <TextBlock>Foo</TextBlock> 
       <TextBlock>Bar</TextBlock> 
       <TextBlock>Baz</TextBlock> 
      </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
</Window> 

ejecutarlo, y verá que el contenido en efecto tamaño para ajustarse a la ventana y la barra de desplazamiento sólo se permite cuando la ventana se vuelve demasiado pequeña para ver los tres puntos. Creo que esto es lo que quieres.

Por lo tanto, es probable que el problema sea uno de los paneles principales, uno que no se muestra en su muestra XAML. El problema que usted describe podría ocurrir si su GroupBox aparece dentro de un StackPanel:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> 
    <StackPanel> 
     <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
      <ScrollViewer> 
       <ItemsControl FontWeight="Normal"> 
        <TextBlock>Foo</TextBlock> 
        <TextBlock>Bar</TextBlock> 
        <TextBlock>Baz</TextBlock> 
       </ItemsControl> 
      </ScrollViewer> 
     </GroupBox> 
    </StackPanel> 
</Window> 

Ahora GroupBox aparece en la parte superior de la ventana, de tamaño para adaptarse exactamente su contenido. Si reduce la ventana lo suficiente, se cortará el GroupBox, porque está dimensionado para ajustarse a su contenido, no a su contenedor. Esto suena como el problema que estás describiendo.

La razón es que StackPanel pregunta a sus hijos cuál es su altura ideal (según su contenido) y usa esa altura. Sin StackPanel (o algo similar), el valor predeterminado es respetar verticalAlignment del control, y si eso se establece en el valor predeterminado de Stretch, entonces el control se estira para llenar su principal. Esto significa que no será más alto que su padre, que suena como lo que quiere.

Solución: elimine el StackPanel (o cualquier otra cosa que le esté causando problemas) y use algo más. Dependiendo de lo que intentes lograr, podrías tener más suerte con un DockPanel o un Grid. Difícil de decir sin saber más acerca de su diseño.

Editar: bien, parece que el problema es de hecho el HeaderedContentControl padre - pero no directamente. HeaderedContentControl no es un panel, por lo que no hace ningún diseño propio (y su descendiente, GroupBox, no tiene el mismo problema). El problema es su plantilla predeterminada, que incluye un StackPanel. La buena noticia es, usted es libre de utilizar una plantilla diferente, digamos que uno con un DockPanel lugar:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <HeaderedContentControl> 
    <HeaderedContentControl.Style> 
     <Style TargetType="{x:Type HeaderedContentControl}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
      <ControlTemplate TargetType="{x:Type HeaderedContentControl}"> 
       <DockPanel> 
       <ContentPresenter ContentSource="Header" DockPanel.Dock="Top"/> 
       <ContentPresenter/> 
       </DockPanel> 
      </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     </Style> 
    </HeaderedContentControl.Style> 
    <GroupBox FontWeight="Bold" Header="Tables" Padding="2"> 
     <ScrollViewer> 
     <ItemsControl FontWeight="Normal"> 
      <TextBlock>Foo</TextBlock> 
      <TextBlock>Bar</TextBlock> 
      <TextBlock>Baz</TextBlock> 
     </ItemsControl> 
     </ScrollViewer> 
    </GroupBox> 
    </HeaderedContentControl> 
</Window> 

Si deja fuera de la parte <HeaderedContentControl.Style>, este reproduce su problema; pero con el estilo en su lugar, permite que GroupBox llene su contenedor, por lo que el ScrollViewer obtendrá una barra de desplazamiento cuando lo desee.

+0

El padre del groupbox (al lado del usercontrol) es un control de contenido headered. Todavía tengo el problema, incluso cuando limito explícitamente su tamaño. Pero tu explicación fue la mejor. Gracias por tomarse el tiempo. –

+0

Gracias por la actualización. Eso hizo el truco. Tuve que hacer algunos otros cambios desde que eliminar el StackPanel tuvo otros impactos. –

0

Intente eliminar la rejilla por completo y establecer HorizontalAlignment y VerticalAlignment directamente en el GroupBox. Si un panel de diseño tiene un solo hijo, a menudo es redundante ... esto puede ser cierto en su caso.

Si eso no funciona ... ¿cuál es el elemento principal de su control de red?

+0

La eliminación de la cuadrícula no cambió nada (pero aún así la eliminé porque era redundante). El padre de la cuadrícula es un control de usuario, que se carga como el contenido de un control de contenido pesado. Limité temporalmente la altura del headedcontentcontrol para ver si se estaba expandiendo, pero eso tampoco solucionó el problema. También probé la sugerencia de 'softwarequestioneer' a continuación sin éxito. –

9

Si la respuesta anterior no soluciona el problema, también puede intentar vincular el Ancho, la Altura de su grilla al Anchura real, la Altura real de su UserControl principal. Algo así como:

<UserControl 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
x:Class="WpfApplication.UserControl1" 
x:Name="UserControl"> 
<Grid Height="{Binding ElementName=UserControl, Path=ActualHeight}" 
     Width="{Binding ElementName=UserControl, Path=ActualWidth}" /> 

En este caso no se está configurando una anchura y altura explícita, sino que está limitando las Rejillas de anchura/altura a las restricciones del control de usuario que está asentado en

0

Por qué no usar. un listbox en lugar de un control de elementos, que tiene un scrollviewer integrado.

2

Tuve el mismo problema, después de leer esta respuesta reemplacé todos los StackPanels con grillas en UserControl. Resolvió el problema de la barra de desplazamiento.

0

Son diferentes. Si no desea que los elementos sean seleccionables, entonces no use un ListBox. Va a ser más pesado, y también tendrá que deseleccionar una selección cada vez que el usuario haga clic en una entrada. Simplemente ponga ItemsControl en ScrollViewer

Cuestiones relacionadas