我在App.xaml中定义了以下样式
<Style x:Key="textBoxMultiline" TargetType="{x:Type TextBox}" >
<Setter Property="VerticalScrollBarVisibility" Value="Auto" />
<Setter Property="HorizontalScrollBarVisibility" Value="Hidden" />
<Setter Property="MinHeight" Value="50" />
<Setter Property="TextWrapping" Value="Wrap" />
</Style>
在整个解决方案中,我们在每个需要简短文本的文本框中使用它。
<TextBox x:Name="textBoxDescription" Grid.Row="2" Grid.Column="1" Style="{DynamicResource textBoxMultiline}" />
一切都运行良好,但随后客户端抱怨某些字段在较低分辨率的旧显示器上被取消,因此我在一个较高的可视树节点上放置ScrollViewer
以防止这种情况。
<ScrollViewer Height="Auto" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
...
</ScrollViewer>
奇怪的是,具有上述风格的TextBox
es开始向右扩展,而不是包裹文本。
有没有办法在不删除ScrollViewer
的情况下阻止这种情况?
答案 0 :(得分:7)
如果您不想硬编码宽度,那么您可以使用元素绑定父项的宽度...这里是一个示例
这里我将textbox maxwidth与scrolviewer实际宽度绑定..而且你必须确保columndefinition width应设置为“*”而不是“Auto”。如果你将它设置为自动它会忽略ScrollViewer的宽度并继续扩展ScrollViewer和文本框的宽度.. 我认为你属于这种情况 .... / p>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<ScrollViewer HorizontalScrollBarVisibility="Auto" Name="scv">
<TextBox Height="30" TextWrapping="Wrap" MaxWidth="{Binding ElementName=scv,Path=ActualWidth}"></TextBox>
</ScrollViewer>
</Grid>
答案 1 :(得分:6)
您必须为MaxWidth
定义TextBox
,否则没有限制,因为ScrollViewer
。
答案 2 :(得分:5)
@bathineni提供的解决方案帮助我解决了我的问题。这对我有用:
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Width="30" Height="23" Margin="10,5" Content="..."/>
<ScrollViewer Grid.Column="1" HorizontalScrollBarVisibility="Disabled" verticalScrollBarVisibility="Disabled" Name="scv">
<TextBox Height="25" Text="Insert here long text" MaxWidth="{Binding ElementName=scv, Path=ActualWidth}" HorizontalAlignment="Stretch" />
</ScrollViewer>
</Grid>
答案 3 :(得分:0)
适合我。如果您希望滚动条显示在文本框中,您可以添加
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
到TextBox
答案 4 :(得分:0)
我不确定为什么,但是我无法使ScrollViewer解决方案正常工作。我需要有一个固定初始宽度的文本框,以实现数字上/下控件-在此控件中,文本框根据输入的变化而缩小和增长,如果用户输入时UI发生变化,该输入将显得非常烦人。
因此,我找到了使用2个文本框为我工作的以下解决方案。第一个文本框是为用户键入其输入内容而显示的文本框,第二个文本框是通过依赖项属性(DisplayLength)和下面进一步显示的转换器初始化的。
将第一个TextBox的MaxWidth属性绑定到第二个TextBox的Width属性可修复大小,以便用户可以键入所需的内容,即使有更多的UI空间,文本框的显示宽度也不会改变。
<TextBox x:Name="PART_TextBox"
Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}"
Margin="0,0,1,0"
TextAlignment="Right"
AcceptsReturn="False"
SpellCheck.IsEnabled="False"
HorizontalContentAlignment="Stretch"
VerticalContentAlignment="Center"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
MaxWidth="{Binding ElementName=TBMeasure, Path=ActualWidth}"
/>
<!-- Hidden measuring textbox ensures reservation of enough UI space
according to DisplayLength dependency property
-->
<TextBox x:Name="TBMeasure"
Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisplayLength, Converter={StaticResource ByteToPlaceHolderStringConverter}}"
Margin="0,0,1,0"
TextAlignment="Right"
AcceptsReturn="False"
SpellCheck.IsEnabled="False"
HorizontalContentAlignment="Right"
VerticalContentAlignment="Center"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
Visibility="Hidden"/>
// Converter
[ValueConversion(typeof(byte), typeof(string))]
public sealed class ByteToPlaceHolderStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if ((value is byte) == false)
return Binding.DoNothing;
byte byteVal = (byte)value;
string retString = string.Empty;
for (int i = 0; i < byteVal; i++)
retString = retString + "X";
return retString;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return Binding.DoNothing;
}
}
答案 5 :(得分:0)
您必须设置MaxWidth
中的Container Control
<Grid x:Name="RootGrid" Margin="6,6,8,8" Width="500" MaxWidth="500">
<ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<GroupBox Name="contentGroup" Header="Content" Grid.Row="0">
<TextBox Name="content"/>
</GroupBox>
</Grid>
</ScrollViewer>