2012-01-01 3 views
6

У меня есть это:Родитель ScrollViewer прокрутки вместо дочернего элемента управления 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> 

Когда я добавляю слишком много строк в TextBox вместо ScrollViewer в TextBox используется, вытягивание коробки и крайние ScrollViewer используется. Могу ли я предотвратить это без фиксации высоты TextBox или TabControl?

Update:

Если удалить MinHeight на TextBox и установить MaxLines до 5, это то, что я получаю:

MinHeight removed and MaxLines set to 5

Если я добавил 6-й линии, полосы прокрутки из TextBox's ScrollViewer, но они по-прежнему остаются центрированными по вертикали в элементе управления TextBox.

ответ

1

я смог сблизиться с этим:

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

Примечание переплета выражение высоты для внешней сетки и MaxHeight для TextBox.

Это все еще не идеально, потому что вы должны вручную установить MinHeight, который вызовет внешнюю большую полосу прокрутки. Вероятно, он близок к тому, что позволит WPF без создания нового элемента управления сеткой.

Идея была найдена здесь: http://social.msdn.microsoft.com/Forums/en/wpf/thread/7b4b0c88-6b8f-4f07-aa8b-8e7018762388

1

Посмотрите на MaxLines и MinLines Недвижимость.

Из выше ссылки:

Установка этого свойства приводит к текстовому полю, чтобы изменить размер, если число видимых линий превышает предел, заданный MaxLines. Это свойство применяется только к видимым линиям и не сдерживает фактическое число строк . В зависимости от его конфигурации текстовое поле может содержать дополнительные невидимые строки, доступные для прокрутки. Если свойство Height явно задано в TextBox, значения свойств MaxLines и MinLines игнорируются.

Try Изменение:

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

в

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

Edit: Дайте этому попытку. Он устанавливает VerticalContentAlignmentTabItem. Это сохранит текстовое поле в верхней части Tab, я также установил максимальные лимиты на то, что ваша доступная область может удерживать, если вы измените размер своей формы, вы можете настроить этот номер, чтобы использовать все доступное пространство.

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

Посмотрев в него дальше, причина, по которой полосы прокрутки не отображаются на TextBox потому, что TabControl и TabItem являются изменения размера к размеру TextBox. Что нужно сделать, так это установить предельную высоту, установленную либо на TabControl, TabItem, либо TextBox, что позволит ScrollViewer работать на TextBox.

+0

Хорошая идея, но это не повлияло. – mbursill

+0

@mbursill Это вообще лимит высоты? Он должен увеличиваться в количестве строк до значения, которое вы установили. –

+0

Nope. Я попытался установить MaxLines на 5, и когда я превысил 5 строк, ничего не произошло. Когда я достигаю 9 строк (если я не изменил размер окна за пределами 450 моего примера), поле TextBox начинает расширяться вертикально, заставляя внешний наблюдатель прокрутки вертикально прокручиваться. Полосы прокрутки TextBox никогда не используются. – mbursill

0

Я обнаружил, что наилучшим решением этой проблемы является использование Border трюк описанной here, применяется как вертикально, так и горизонтально.

В следующем примере ScrollViewer содержит TextBox, где желательно иметь TextBox подходят все доступное пространство (по вертикали и по горизонтали), и иметь его прокрутки по вертикали до родителя ScrollViewer. BorderPlaceHolderBorder управляет WidthTextBox es при изменении размера родительского окна. DescriptionPlaceHolderBorder управляет HeightDescriptionTextBox при изменении размера родительского элемента управления, а ScrollViewerTextBox срабатывает перед родительским элементом управления.

Важно иметь Margin s в заполнителе 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> 
Смежные вопросы