阻止TextBox在WPF中进行水平扩展

时间:2011-07-28 10:10:44

标签: wpf textbox textwrapping

我在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的情况下阻止这种情况?

6 个答案:

答案 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>