我有这个:
<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
。我可以在不修复ScrollViewer
或TextBox
的高度的情况下阻止这种情况吗?
更新
如果我移除了TabControl
上的MinHeight
并将TextBox
设置为5,那就是我得到的:
如果我添加了第6行,则会使用MaxLines
的{{1}}的滚动条,但它们仍然会在TextBox
控件中保持垂直居中。
答案 0 :(得分:1)
从上面链接:
设置此属性会导致文本框大小调整大小 可见行超出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>
上的原因是因为TextBox
和TabControl
调整为TabItem
的大小}。需要做的是在TextBox
,TabControl
或TabItem
设置限制高度,这将允许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