2012-01-01 11 views
6

tengo esto:Padres ScrollViewer desplazamiento en lugar de control secundario ScrollViewer

<Window x:Class="ScrollTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Height="450" 
     Width="525"> 
    <ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Visible" 
        ScrollViewer.VerticalScrollBarVisibility="Visible"> 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <GroupBox Grid.Row="0" 
         Header="Stuff" 
         Height="200"> 
       <TextBlock Text="Lots of controls go here" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center" /> 
      </GroupBox> 
      <TabControl Grid.Row="1"> 
       <TabItem Header="Main Tab"> 
        <TextBox MinHeight="100" 
          HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch" 
          HorizontalContentAlignment="Left" 
          VerticalContentAlignment="Top" 
          ScrollViewer.HorizontalScrollBarVisibility="Visible" 
          ScrollViewer.VerticalScrollBarVisibility="Visible" 
          AcceptsReturn="True" /> 
       </TabItem> 
      </TabControl> 
     </Grid> 
    </ScrollViewer> 
</Window> 

Cuando agrego demasiadas filas en la TextBox, en lugar de la ScrollViewer del TextBox siendo utilizados, los tramos de la caja y la más externa ScrollViewer es usado. ¿Puedo evitar eso sin fijar la altura de TextBox o TabControl?

Actualización:

Si quito MinHeight en el TextBox y establecer MaxLines a 5, esto es lo que me sale:

MinHeight removed and MaxLines set to 5

Si he añadido una línea sexta, las barras de desplazamiento de TextBox 's ScrollViewer se utilizan, pero aún permanecen centradas verticalmente en el control TextBox.

Respuesta

1

que era capaz de acercarse con esto:

<Window x:Class="ScrollTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" 
     Width="525"> 
    <ScrollViewer ScrollViewer.VerticalScrollBarVisibility="Visible" 
        x:Name="Base"> 
     <Grid Height="{Binding ElementName=Base, Path=ActualHeight, Mode=OneWay}" 
       MinHeight="400"> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition Height="*" /> 
      </Grid.RowDefinitions> 

      <GroupBox Grid.Row="0" 
         Header="Stuff" 
         Height="200"> 
       <TextBlock Text="Lots of controls go here" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center" /> 
      </GroupBox> 
      <TabControl Grid.Row="1"> 
       <TabItem Header="Main Tab"> 
        <Grid x:Name="myInnerGrid"> 
         <TextBox MinHeight="100" 
           MaxHeight="{Binding ElementName=myInnerGrid, Path=ActualHeight, Mode=OneWay}" 
           HorizontalAlignment="Stretch" 
           VerticalAlignment="Stretch" 
           HorizontalContentAlignment="Left" 
           VerticalContentAlignment="Top" 
           ScrollViewer.HorizontalScrollBarVisibility="Visible" 
           ScrollViewer.VerticalScrollBarVisibility="Visible" 
           AcceptsReturn="True" /> 
        </Grid> 
       </TabItem> 
      </TabControl> 
     </Grid> 
    </ScrollViewer> 
</Window> 

Nota la expresión de unión de la altura de la rejilla exterior y en MaxHeight para la TextBox.

Aún no es perfecto, ya que tiene que configurar manualmente el MinHeight que activará la barra de desplazamiento más externa. Probablemente esté lo más cerca que WPF lo permita sin escribir un nuevo control de cuadrícula.

Se encontró que la idea aquí: http://social.msdn.microsoft.com/Forums/en/wpf/thread/7b4b0c88-6b8f-4f07-aa8b-8e7018762388

1

Intente mirar MaxLines y MinLines Propiedades.

Desde arriba enlace:

establecer esta propiedad hace que el cuadro de texto para cambiar el tamaño si el número de líneas visibles excede el límite especificado por maxLines. Esta propiedad se aplica solo a las líneas visibles, y no limita el número real de líneas . Dependiendo de su configuración, un cuadro de texto puede contener líneas adicionales no visibles a las que se puede acceder desplazándose. Si la propiedad Height está establecida explícitamente en un TextBox, los valores de las propiedades de MaxLines y MinLines se ignoran.

pruebe a cambiar:

<TextBox MinHeight="100" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 
     ... 

a

<TextBox MinLines="5" 
     MaxLines="5" 
     HorizontalAlignment="Stretch" 
     VerticalAlignment="Stretch" 

Editar: le daría prueba. Está configurando el VerticalContentAlignment del TabItem. Esto mantendrá el cuadro de texto en la parte superior de Tab, también configuré las líneas máximas de acuerdo con lo que su área disponible puede contener si cambia el tamaño de su formulario, puede ajustar ese número para usar todo el espacio disponible.

<TabItem Header="Main Tab" VerticalContentAlignment="Top" > 
    <TextBox 
       ScrollViewer.HorizontalScrollBarVisibility="Visible" 
       ScrollViewer.VerticalScrollBarVisibility="Visible" 
       MinLines="8" 
       MaxLines="8" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       HorizontalContentAlignment="Stretch" 
       VerticalContentAlignment="Stretch" 
       AcceptsReturn="True" /> 
</TabItem> 

Editar:

Después de mirar en él aún más, la razón por las barras de desplazamiento no se muestran en la TextBox es debido a que el TabControl y la TabItem a cambiar el tamaño al tamaño de la TextBox. Lo que debe hacerse es tener un conjunto de alturas limitadoras en el TabControl, TabItem o TextBox, esto permitirá que el ScrollViewer funcione para el TextBox.

+0

Buena idea, pero no tuvo ningún efecto. – mbursill

+0

@mbursill ¿Limitó la altura en absoluto? Debería crecer en número de líneas hasta el valor que establezca. –

+0

No. Intenté configurar MaxLines en 5, y cuando superé 5 líneas, no sucedió nada diferente. Cuando llego a 9 líneas (si no he redimensionado la ventana más allá de los 450 de mi ejemplo), el cuadro Cuadro de texto comienza a expandirse verticalmente, haciendo que el visor de desplazamiento externo se desplace verticalmente. Las barras de desplazamiento de TextBox nunca se utilizan. – mbursill

0

He descubierto que la mejor solución para esto es utilizar el truco Border esbozado here, aplicado tanto vertical como horizontalmente.

En el siguiente ejemplo, un ScrollViewer contiene una TextBox, en donde se desea tener la TextBox encajar todo el espacio disponible (vertical y horizontal), y tienen que desplazarse verticalmente antes de que el padre ScrollViewer. El BorderPlaceHolderBorder gestiona el Width del TextBox es cuando se cambia el tamaño de la ventana primaria. El BorderDescriptionPlaceHolderBorder gestiona el Height del DescriptionTextBox cuando el control principal se redimensiona, y el ScrollViewer del TextBox entra en acción antes del control principal.

Es importante tener Margin s en el marcador de posición Border s.

<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Background="{StaticResource ControlBackgroundBrush}"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
      <RowDefinition Height="*"></RowDefinition> 
      <RowDefinition Height="Auto"></RowDefinition> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="10"></ColumnDefinition> 
      <ColumnDefinition Width="Auto"></ColumnDefinition> 
      <ColumnDefinition Width="*"></ColumnDefinition> 
      <ColumnDefinition Width="10"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 
     <Label Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="2" Style="{DynamicResource LabelHeader}" Content="Company" /> 
     <Label Grid.Row="1" Grid.Column="1" Style="{DynamicResource CompanyNameInput}" Content="{Binding CompanyNameLabel}" /> 
     <Label Grid.Row="2" Grid.Column="1" Style="{DynamicResource DescriptionInput}" Content="{Binding DescriptionLabel}" /> 
     <Border Name="PlaceHolderBorder" Grid.Column="2" Margin="7"/> 
     <TextBox Grid.Row="1" Grid.Column="2" Text="{Binding CompanyName}" MaxLength="255"/> 
     <Border Name="DescriptionPlaceHolderBorder" Grid.Row="2" Margin="7"/> 
     <TextBox Grid.Row="2" Grid.Column="2" Text="{Binding Description}" VerticalScrollBarVisibility="Auto" 
       TextAlignment="Left" TextWrapping="Wrap" AcceptsReturn="True" MinHeight="60" 
       Width="{Binding ElementName=PlaceHolderBorder, Path=ActualWidth}" 
       Height="{Binding ElementName=DescriptionPlaceHolderBorder, Path=ActualHeight}" 
     /> 
     <StackPanel Orientation="Horizontal" Grid.Row="3" Grid.Column="2" Margin="5"> 
      <Button Command="{Binding UpdateCommand}" Content="{Binding UpdateButtonLabel}"></Button> 
      <Button Command="{Binding ResetCommand}" Content="{Binding ResetButtonLabel}"></Button> 
      <Button Command="{Binding CloseConfirmCommand}" Content="{Binding CloseButtonLabel}"></Button> 
     </StackPanel> 
    </Grid> 
</ScrollViewer> 
Cuestiones relacionadas