2011-07-28 58 views
7

一个TextBox我在我的App.xaml防止从水平扩大WPF

<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}" /> 

一切都很正常,但随后的客户抱怨一些领域进行上分辨率较低的旧式显示器corped,所以我放在一个ScrollViewer在更高的视觉节点,以防止corping之一。

<ScrollViewer Height="Auto" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"> 
    ... 
</ScrollViewer> 

奇怪的是,TextBox ES与上述风格开始扩大到右边,而不是包装的文字。

有没有办法在不去除ScrollViewer的情况下防止这种情况?

回答

4

您必须为TextBox定义一个MaxWidth,否则没有限制,因为ScrollViewer

+0

我使用的风格,不同宽度的文本框。我有点寻找更通用的解决方案,如覆盖文本框模板以包含固定宽度的东西,然后将textBox实际宽度绑定到新的元素宽度。这似乎有很多过度工程,但我一直在寻找只会改变TextBox风格的东西。 – dcarneiro

+0

你在做什么有些矛盾。你将有宽度的文本框限制,然后你将它放在一个滚动查看器有一个无限的水平空间(“自动”)。你可以解决它,但没有一个通用的方法。你应该从scrollviewer的ActualWidth和文本框的(Max)Width创建一个绑定。问题是你必须添加一个转换器,以考虑补偿和其他东西(非常讨厌我)。 –

+0

水平滚动条是黑客,因为其他控件在低分辨率屏幕上被裁剪。我试图将文本框宽度绑定到相同宽度的元素(另一个具有相同样式但隐藏的网格单元格上的文本框)并且它工作正常。但之后我发现信息所在的TextBlock也会水平扩展而不是包装文本。这告诉我水平滚动条优先于TextWrapping属性。所以我想我必须重新设计UI才能支持低屏幕分辨率。 – dcarneiro

7

如果你不想硬编码的宽度,那么你可以去元件结合的父项的宽度......这里是一个样本

我在这里结合文本与maxwidth实际scrolviewer宽度。并且还必须确保将列定义宽度设置为“*”而不是“自动”。如果你把它设置为自动会忽略的ScrollViewer宽度和不断扩大的ScrollViewer和文本框的宽度.. 我想你在这种情况下 ....

<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

可悲的是ScrollViewer和TextBox之间有几个VisualTreeItems,它们甚至不在同一个UserControl上。尽管如此仍然存在利润/填充抵消。 AFAIK真正的挑战在哪里是优先TextWrapping水平调整大小的祖先用户控件。 – dcarneiro

4

该解决方案从提供的下降@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> 
0

适合我。如果你想滚动条出现在文本框,您可以添加

HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" 

到TextBox