首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >父控件ScrollViewer滚动而不是子控件ScrollViewer

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

Stack Overflow用户
提问于 2012-01-01 23:45:14
回答 3查看 3.2K关注 0票数 6

我有这个:

代码语言:javascript
复制
<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中,而不是使用TextBoxScrollViewer时,框就会扩展,而最外层的ScrollViewer就会被使用。如果不确定TextBoxTabControl的高度,我能阻止这种情况吗?

更新:

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-05 05:26:04

我得以接近这个:

代码语言:javascript
复制
<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>

请注意外部网格在高度上的绑定表达式和TextBoxTextBox上的绑定表达式。

它仍然不完美,因为您必须手动设置将触发外部最滚动条的MinHeight。如果不编写新的网格控件,它可能与WPF所允许的一样接近。

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

票数 1
EN

Stack Overflow用户

发布于 2012-01-02 00:26:05

尝试查看MaxLinesMinLines属性。

从上面的链接:

如果可见行数超过MaxLines指定的限制,则设置此属性将导致文本框调整大小。此属性仅适用于可见行,不限制实际行数。根据其配置,文本框可能包含其他可通过滚动访问的不可见行。如果在TextBox上显式设置高度属性,则将忽略MaxLines和MinLines属性值。

试着改变:

代码语言:javascript
复制
<TextBox MinHeight="100" 
         HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch" 
         ...

代码语言:javascript
复制
<TextBox MinLines="5" 
         MaxLines="5"
         HorizontalAlignment="Stretch" 
         VerticalAlignment="Stretch"

编辑:试试看。它正在设置VerticalContentAlignmentTabItem。这将使文本框保持在Tab顶部,如果您调整窗体的大小,可能需要调整该数字以使用所有可用空间,则我还将最大行设置为您的可用区域能够容纳的内容。

代码语言:javascript
复制
<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上的原因是TabControlTabItem正在调整大小为TextBox。需要做的是在TabControlTabItemTextBox上设置一个限制高度,这将允许ScrollViewerTextBox工作。

票数 1
EN

Stack Overflow用户

发布于 2013-01-19 20:33:10

我发现,对此最好的解决方案是使用Border技巧概述的这里,在垂直和水平上应用。

在下面的示例中,ScrollViewer包含一个TextBox,其中希望TextBox适合所有可用空间(垂直和水平),并在父ScrollViewer之前垂直滚动。当父窗口调整大小时,Border PlaceHolderBorder管理TextBoxes的WidthBorder DescriptionPlaceHolderBorder在调整父控件的大小时管理Description TextBoxHeightTextBoxScrollViewer在父控件之前启动。

在占位符Margins中包含Border是很重要的。

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8696378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档