文本框不会拉伸以填充视图框

时间:2012-01-04 11:40:25

标签: wpf forms layout textbox viewbox

我希望我的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 =“True”),然后将文本框放在这些布局控件中,但这也不起作用。反正有没有让文本框水平填充父视图框?

此问题与此类似:WPF TextBox won't fill in StackPanel但此问题出在stackpanels上,而非viewboxes。

2 个答案:

答案 0 :(得分:11)

我认为你想要的并不容易。 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>

这将拉伸文本框infact,但禁用视图框中预期的行为。为什么?我们告诉ViewBox保持纵横比,并设置文本框以填充视图框的整个宽度,从而保持文本框的大小。

第二个:

将从网格中添加一个高度,从标签中取出,并使用其视图框的scaletransform进行修改。

这个我还没试过,但它会涉及一个价值转换器。

总之:由于视图框布局其子项的方式,没有简单的方法来实现您想要的。如果您只想水平拉伸,我的第一个解决方案可以正常工作,如果您想要缩放。我的猜测是你必须自己做。

答案 1 :(得分: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获得焦点时,它会将焦点切换到Viewbox的{​​{1}} 。这将产生一些奇怪的大小调整,因为您的网格设置具有相对大小。您将需要使用网格列/宽度大小,直到获得所需的效果。