2012-01-04 29 views
6

我希望我的LOB表单中的标签和文本框的字体大小随窗口大小或分辨率更改而增大和缩小。为了达到这个目的,我将标签和文本框放在了视框内。文本框不会伸展以填充视图框

标签和自定义单选按钮的行为与我所期望的相同,但是文本框不会水平拉伸以填充视图框(因为代表无法发布图像)。如果您输入内容,文本框将水平填充视图框。

这里是我与使用的代码的一个例子:

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="0.186*"/> 
      <ColumnDefinition Width="0.814*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="0.127*"/> 
      <RowDefinition Height="0.873*"/> 
     </Grid.RowDefinitions> 
     <Viewbox Margin="0,0,0.917,0"> 
      <Label Content="First name:"/> 
     </Viewbox> 
     <Viewbox Grid.Column="1"> 
      <TextBox TextWrapping="Wrap"/> 
     </Viewbox> 
    </Grid> 

我试图将网格,和StackPanel中DockPanel中(与LastChildFill =“真”)的视框内,然后放置文本框在这些布局控件中,但这也不起作用。无论如何,让文本框水平填充父视图框?

此问题与此类似:WPF TextBox won't fill in StackPanel但此问题与堆叠面板而不是视框有关。

+0

第一件事是让你的xaml正确:你没有为每个网格项指定Column/row。 – GameAlchemist 2012-01-04 12:00:43

+1

@VincentPiel这其实并不重要。列和行默认为0. – mydogisbox 2012-01-04 14:15:41

回答

10

我觉得你想要的是不容易的。 ViewBox告诉它的孩子他们有足够的空间,通过布局的措施。之后,显示器将被放入视图框中。现在一个文本框被告知有无限的空间,显然无法伸展。 我有2个解决方案,我认为这不是你想要的,但无论如何可能有帮助。

第一:

<Viewbox Grid.Column="1" Grid.Row="0" Stretch="Uniform" > 
    <Grid Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Viewbox}}, Path=ActualWidth}"> 
     <TextBox TextWrapping="Wrap" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
    </Grid> 
</Viewbox> 

这样能伸展你的TextBox逸岸,但禁止从视框中期望的行为。为什么?我们告诉ViewBox保持宽高比,并将文本框设置为填充视框的整个宽度,这保持了文本框的大小。

第二种:

将高度添加到网格,从标签取出,用其视框的scaletransform修改。

这一个我没有尝试过,但它会涉及到一个值转换器。

结论:由于视框布置其子项的方式,没有简单的方法来实现你想要的。如果你只想水平拉伸,我的第一个解决方案工作正常,如果你想扩展。我的猜测是你必须自己做。

+1

有关绑定到AcutalWidth或ActualHeight的警告:“因为ActualHeight是计算值,所以您应该意识到,可能会有多个或增量报告的更改,作为各种操作的结果布局系统。布局系统可能正在计算子元素所需的度量空间,父元素的约束等等。“这可能会导致绑定ActualHeight或ActualWidth的任何绑定在每次调整大小时会多次触发,如果也有这样的话,这会对性能产生影响很多这些bindigs。 – mydogisbox 2012-01-04 14:29:48

+0

+1当然你是对的,它的价值指出,但在这种情况下,我不知道更好的解决方案。 – dowhilefor 2012-01-04 16:52:15

+0

哈哈!我没有真正的宽度! – mydogisbox 2012-01-04 18:04:12

1

如果你想不工作是什么/是不容易的,然后假货:

<TextBox GotFocus="TextBox_GotFocus" HorizontalAlignment="Stretch" BorderThickness="0" Grid.Column="1"/> 
    <Viewbox HorizontalAlignment="Left" Stretch="Uniform" Grid.Column="1"> 
     <TextBox x:Name="NameTextBox" Width="50" TextWrapping="Wrap" Text="Text" BorderThickness="0"/> 
    </Viewbox> 

    private void TextBox_GotFocus(object sender, RoutedEventArgs e) 
    { 
     NameTextBox.Focus(); 
     NameTextBox.SelectionStart = NameTextBox.Text.Length; 
    } 

基本上会发生什么是另一个TextBoxViewbox后面,当后面TextBox获得焦点,它切换焦点ViewboxTextBox。这会产生一些奇怪的调整大小,因为你有相对大小的网格设置。你将需要玩弄你的网格列/宽度大小,直到你得到你想要的效果。