2012-01-01 13 views
6

ho questo:ScrollViewer scorrimento invece di controllo figlio 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> 

Quando aggiungo troppe righe nel TextBox, al posto del ScrollViewer del TextBox in uso, i tratti box e il più esterno ScrollViewer si usa. Posso evitarlo senza fissare l'altezza dello o TabControl?

Aggiornamento:

Se rimuovo MinHeight sulla TextBox e impostare MaxLines-5, questo è ciò che ottengo:

MinHeight removed and MaxLines set to 5

Se ho aggiunto una linea di 6, le barre di scorrimento degli ScrollViewer di vengono utilizzati, ma rimangono comunque centrati verticalmente nel controllo TextBox.

risposta

1

ho potuto avvicinarsi con questo:

<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 l'espressione vincolante altezza per la griglia esterna e MaxHeight per il TextBox.

Non è ancora perfetto in quanto è necessario impostare manualmente lo MinHeight che attiverà la barra di scorrimento più esterna. Probabilmente è vicino quanto WPF permetterà senza scrivere un nuovo controllo di griglia.

L'idea è stata trovata qui: http://social.msdn.microsoft.com/Forums/en/wpf/thread/7b4b0c88-6b8f-4f07-aa8b-8e7018762388

1

Prova a guardare le proprietà MaxLines e MinLines.

Dall'alto link:

impostazione di questa proprietà fa sì che la casella di testo per ridimensionare se il numero di righe visibili supera il limite specificato da MAXLINES. Questa proprietà si applica solo alle linee visibili e non limita il numero effettivo di righe . A seconda della sua configurazione, una casella di testo può contenere ulteriori righe non visibili che sono accessibili scorrendo. Se la proprietà Height è impostata in modo esplicito su un controllo TextBox, i valori delle proprietà MaxLines e MinLines vengono ignorati.

provare a cambiare:

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

a

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

Edit: dare una prova. Sta impostando lo VerticalContentAlignment dello TabItem. Ciò manterrà la casella di testo nella parte superiore di Tab, inoltre imposto le massime a ciò che l'area disponibile è in grado di contenere se si ridimensiona il modulo, è possibile che si desideri regolare tale numero per utilizzare tutto lo spazio disponibile.

<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> 

Edit:

Dopo aver guardato in esso ulteriormente, la ragione per le barre di scorrimento non vengono visualizzati sul TextBox è perché il TabControl e la TabItem sono il ridimensionamento delle dimensioni del TextBox. Quello che deve essere fatto è di avere un'altezza limite impostata su TabControl, TabItem o TextBox questo consentirà al ScrollViewer di funzionare per lo TextBox.

+0

Buona idea, ma non ha avuto alcun effetto. – mbursill

+0

@mbursill Ha limitato l'altezza? Dovrebbe crescere in numero di righe fino al valore impostato. –

+0

No. Ho provato a impostare MaxLines su 5 e, quando ho superato 5 righe, non è successo nulla di diverso. Quando raggiungo 9 righe (se non ho ridimensionato la finestra oltre il 450 del mio esempio), la casella TextBox inizia ad espandersi verticalmente, facendo sì che il visualizzatore di scorrimento più esterno sia scorrevole verticalmente. Le barre di scorrimento del TextBox non vengono mai utilizzate. – mbursill

0

ho trovato che la soluzione migliore è usare la Border trick delineato here, applicato sia verticalmente che orizzontalmente.

Nel seguente esempio, un ScrollViewer contiene un TextBox, dove si desidera avere il TextBox adattare tutto lo spazio disponibile (verticale e orizzontale), e farlo scorrere verticalmente prima del genitore ScrollViewer. Lo BorderPlaceHolderBorder gestisce lo Width dello TextBox mentre la finestra padre viene ridimensionata. Il Border gestisce il Height del DescriptionTextBox mentre il controllo genitore viene ridimensionato e lo ScrollViewer del TextBox viene attivato prima del controllo genitore.

È importante avere Margin s nel segnaposto 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> 
Problemi correlati