我有个问题。我需要在ScrollViewer中托管带有控件的网格,以防止文本框在UI中被截断或折叠为零。另外,我希望当用户更改窗口宽度时,文本框的使用将被扩展。我正在将窗口的内容设置为以下代码
<DockPanel>
<TreeView DockPanel.Dock="Left" Width="150"/>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="Name"
Margin="5"
VerticalAlignment="Center"/>
<TextBox Grid.Column="1"
Text="Some Name"
Margin="5"
VerticalAlignment="Center"
MinWidth="200"/>
</Grid>
</ScrollViewer>
</DockPanel>
一切都很好,但当用户在TextBox中键入很长的文本时,它会被展开,并出现水平滚动。有没有什么简单的方法来限制TextBox的最大宽度,并允许它只在用户改变窗口大小时扩展。
发布于 2008-12-22 12:55:28
问题是父元素为TextBox提供了它认为需要的尽可能多的空间,当出现更多文本时,它将扩展而不是停留在初始的自动大小。
这里的一种解决方案是创建另一个自动调整大小的元素,并将TextBox.Width绑定到它:
<DockPanel>
<TreeView Width="150" DockPanel.Dock="Left"/>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/>
<Border x:Name="b" Grid.Column="1" Margin="5"/>
<TextBox Width="{Binding ActualWidth, ElementName=b}"
MinWidth="200"
Grid.Column="1"
Margin="5"
VerticalAlignment="Center"
Text="Some Name"/>
</Grid>
</ScrollViewer>
</DockPanel>
注意,我们设置了自动调整大小元素(边框)的边距属性。这一点很重要,因为如果不设置它,将会有一个循环:
通过将边距设置为与TextBox相同,TextBox的大小调整不会影响网格大小。
发布于 2011-11-25 22:08:20
像这样覆盖TextBox.MeasureOverride
对我来说很有效:
protected override Size MeasureOverride(Size constraint)
{
Size origSize = base.MeasureOverride(constraint);
origSize.Width = MinWidth;
return origSize;
}
发布于 2011-01-01 06:15:44
否-这是wpf的一个众所周知的问题,预计将在下一个版本中修复。谢谢
https://stackoverflow.com/questions/386039
复制相似问题