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

时间:2012-01-01 23:45:15

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

当我在TextBox中添加太多行而不是正在使用的ScrollViewer的{​​{1}}时,框会拉伸并使用最外面的TextBox。我可以在不修复ScrollViewerTextBox的高度的情况下阻止这种情况吗?

更新

如果我移除了TabControl上的MinHeight并将TextBox设置为5,那就是我得到的:

MinHeight removed and MaxLines set to 5

如果我添加了第6行,则会使用MaxLines的{​​{1}}的滚动条,但它们仍然会在TextBox控件中保持垂直居中。

3 个答案:

答案 0 :(得分:1)

尝试查看MaxLinesMinLines属性。

从上面链接:

  

设置此属性会导致文本框大小调整大小   可见行超出MaxLines指定的限制。这个性质   仅适用于可见线,并不限制实际线条   行数。根据其配置,文本框可以   包含可通过滚动访问的其他不可见行。   如果在TextBox上显式设置了Height属性,则为MaxLines   和MinLines属性值被忽略。

尝试更改:

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

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

编辑:尝试一下。它正在设置VerticalContentAlignment的{​​{1}}。这会将文本框保留在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> 上的原因是因为TextBoxTabControl调整为TabItem的大小}。需要做的是在TextBoxTabControlTabItem设置限制高度,这将允许TextBox适用于ScrollViewer

答案 1 :(得分: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的{​​{1}}上的绑定表达式。

它仍然不完美,因为您必须手动设置将触发最外侧滚动条的TextBox。它可能与WPF一样接近,而无需编写新的网格控件。

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

答案 2 :(得分:0)

我发现最好的解决方案是使用Border技巧here,垂直和水平应用。

在以下示例中,ScrollViewer包含TextBox,希望TextBox适合所有可用空间(垂直和水平),并让它滚动在父ScrollViewer之前的垂直方向。随着父窗口的大小调整,Border PlaceHolderBorder管理Width的{​​{1}}。调整父控件的大小为TextBox Border DescriptionPlaceHolderBorder Height Description在父控件之前启动。

在占位符TextBox中添加ScrollViewer非常重要。

TextBox