考虑以下XAML示例。
我的问题是,如果文字越来越大,文本框会变得越来越大。但我只想要,文本框适合网格空间。
如何禁用内容较大的文本大小调整文本框?
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="26" />
<RowDefinition Height="10*" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" MinWidth="130" />
<ColumnDefinition Width="130" />
</Grid.ColumnDefinitions>
<Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 1" Grid.Column="0" Grid.Row="0"/>
<TextBox x:Name="Tbox1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" Height="22" Grid.Column="1" Grid.Row="0" />
<Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 2" Grid.Column="0" Grid.Row="1"/>
<TextBox x:Name="Tbox2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" Height="22" Grid.Column="1" Grid.Row="1" />
</Grid>
</ScrollViewer>
答案 0 :(得分:4)
您需要确保TextBox不会调整网格大小。
最简单的方法是将文本框放在这样的容器中,忽略其子容量,例如Canvas
。您还需要通过将文本框大小绑定到列宽来设置文本框大小。
<ScrollViewer HorizontalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition x:Name="MiddleColumn" Width="*" MinWidth="130" />
<ColumnDefinition Width="130" />
</Grid.ColumnDefinitions>
<Canvas Grid.Column="1">
<TextBox Width="{Binding ActualWidth, ElementName=MiddleColumn}"/>
</Canvas>
</Grid>
</ScrollViewer>
然而,请注意,画布还会加入TextBox的高度,如果文本被包装,则行不会调整大小。您可以通过DataBinding Canvas height将其解决为TextBox.ActualHeight。您可以将此布局绑定封装为可重用的样式:
<ContentControl Grid.Column="1" Style="{StaticResource IgnoreContentWidthStyle}">
<TextBox Text="asfasdf asdfad sfa sdf" TextWrapping="Wrap"/>
</ContentControl>
<Style x:Key="IgnoreContentWidthStyle" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Canvas Height="{Binding ActualHeight, ElementName=PART_Content}">
<ContentPresenter x:Name="PART_Content"
Content="{TemplateBinding Content}"
Width="{TemplateBinding ActualWidth}"/>
</Canvas>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
或者,您可以创建派生自Panel或Decorator的自定义元素,它将覆盖MeasureOverride和ArrangeChildren并将文本框放在其中。这种方法可以提供更好的性能,因为您可以避免布局绑定。
答案 1 :(得分:1)
好吧,我认为你有2个选项可以阻止文本框变大:
将文本框最大宽度绑定到另一个元素,如下所示:
<Grid Grid.Column="1" Name="grdWidth"/>
<Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 1" Grid.Column="0" Grid.Row="0"/>
<TextBox x:Name="Tbox1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf safasdf asdf asdf fasasd fas f" TextWrapping="Wrap"
MaxWidth="{Binding ActualWidth, ElementName=grdWidth}" Height="22" Grid.Column="1" Grid.Row="0" />
<Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 2" Grid.Column="0" Grid.Row="1"/>
<TextBox x:Name="Tbox2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" Height="22" Grid.Column="1"
MaxWidth="{Binding ActualWidth, ElementName=grdWidth}"
Grid.Row="1" />
</Grid>
我个人会选择第一个选项