父控件ScrollViewer滚动而不是子控件ScrollViewer

mbu*_*ill 6 c# wpf scroll parent-child 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>
Run Code Online (Sandbox Code Playgroud)

当我添加太多的行成TextBox,而不是ScrollViewerTextBox使用,箱体延伸和最外层ScrollViewer使用.我可以在不修复TextBox或高度的情况下防止这种情况TabControl吗?

更新:

如果我删除MinHeightTextBox,并设置MaxLines为5,这是我得到:

MinHeight已删除,MaxLines设置为5

如果我添加了第6行,则使用TextBoxs 的滚动条ScrollViewer,但它们仍然在TextBox控件中保持垂直居中.

mbu*_*ill 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>
Run Code Online (Sandbox Code Playgroud)

MaxHeight请注意外部网格高度的绑定表达式和TextBox.

它仍然不完美,因为您必须手动设置MinHeight将触发最外面的滚动条。它可能是 WPF 所允许的最接近的结果,而无需编写新的网格控件。

这个想法是在这里找到的: http://social.msdn.microsoft.com/Forums/en/wpf/thread/7b4b0c88-6b8f-4f07-aa8b-8e7018762388