Прокрутка родительского элемента управления ScrollViewer вместо дочернего элемента управления ScrollViewer - PullRequest
6 голосов
/ 02 января 2012

У меня есть это:

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

Обновление:

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

MinHeight removed and MaxLines set to 5

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

Ответы [ 3 ]

1 голос
/ 05 января 2012

Мне удалось подобраться к этому:

<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 голос
/ 02 января 2012

Попробуйте посмотреть свойства MaxLines и MinLines .

Ссылка сверху:

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

Попробуйте изменить:

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

на

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

Изменить: Дайте это попробовать.Это установка VerticalContentAlignment из TabItem.Это сохранит текстовое поле в верхней части 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>

Редактировать:

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

.
0 голосов
/ 20 января 2013

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

В следующем примере ScrollViewer содержитTextBox, где желательно, чтобы TextBox поместился во все доступное пространство (по вертикали и по горизонтали), и чтобы он прокручивался вертикально перед родительским ScrollViewer.Border PlaceHolderBorder управляет Width из TextBox es при изменении размера родительского окна.Border DescriptionPlaceHolderBorder управляет Height Description TextBox при изменении размера родительского элемента управления, а ScrollViewer из TextBox запускается перед родительским элементом управления.

Важно иметь 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>
...