如何在窗口调整大小时调整文本框大小

时间:2010-12-21 03:06:48

标签: wpf

设置为根据窗口大小调整文本框大小的任何属性?

4 个答案:

答案 0 :(得分:20)

WPF中的布局受父容器的影响很大。例如,如果要创建包含标签和输入字段的表单,请考虑使用“网格”面板。默认情况下,WPF中的控件根据其父级的布局行为调整大小。下面是一个窗口示例,其中包含两个带标签的文本框和两个随窗口一起调整大小的按钮。

<Window>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Label Content="Contact Name" Grid.Row="0" Grid.Column="0" />
        <TextBox Grid.Row="0" Grid.Column="1" />

        <Label Content="Contact Location" Grid.Row="1" Grid.Column="0" />
        <TextBox Grid.Row="1" Grid.Column="1" />

        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right"
                    VerticalAlignment="Bottom" Grid.Row="2" Grid.Column="1">
            <Button Content="OK" Width="75" Height="24" Margin="3" />
            <Button Content="Cancel" Width="75" Height="24" Margin="3" />
        </StackPanel>

    </Grid>
</Window>

或者,如果您想要类似于浏览器地址栏布局的内容,您可以执行以下操作:

<Window>
    <DockPanel>
        <DockPanel DockPanel.Dock="Top">
            <Button Content="Back" DockPanel.Dock="Left" />
            <Button Content="Forward" DockPanel.Dock="Left" />
            <Button Content="Refresh" DockPanel.Dock="Right" />
            <TextBox /> <!-- fill is assumed for last child -->
        <DockPanel>
        <StatusBar DockPanel.Dock="Bottom" />
        <WebBrowser /> <!-- fill is assumed for last child -->
    </DockPanel>
</Window>

请注意,在上面的示例中,我嵌套了两个DockPanel。它也可以通过网格实现,但标记会更加混乱。如果您是WPF新手,我强烈建议您使用各种面板。一旦您了解何时将特定面板应用于特定布局,就可以更轻松地使用WPF。

答案 1 :(得分:3)

有点晚了,但我希望每个人都知道这一点。

要使文本框填满整个窗口并使用它调整大小,您需要将其高度显式设置为自动,即使它是默认值!

答案 2 :(得分:1)

由于几乎没有限制,这可能有点棘手。

  1. 文本框你不能把宽度自动(在我的情况下,如果一些复制粘贴长字符串,它因为自动宽度而超出边界)。
  2. 我无法保持默认值,因为如果没有文字,它的宽度非常小,所以我需要MinWidth。
  3. 同时你必须有一个静态宽度表示,因为我们想要包装特定行的文本。
  4. 我尝试了这个解决方案,让你的宽度限制为父级(我同意也可能有更好的解决方案,但这很容易并且工作正常)

    <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" Name="LeftColumnDefinition" />
          <ColumnDefinition Width="150" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <TextBox Grid.Column="0" BorderThickness="3" VerticalScrollBarVisibility="Auto" HorizontalAlignment="Stretch" ClipToBounds="True"
                             TextWrapping="Wrap" Width= "{Binding ElementName=LeftColumnDefinition, Path=Width}"  MinWidth="560" MinHeight="57" AcceptsTab="True" Foreground="{StaticResource darkBlueBrush}">FIX message... </TextBox>
         <Button Margin="2,0,0,0"  Grid.Column="1" Content="Publish FIX Message" Name="PublishFIX" Click="publishFix_Click" HorizontalAlignment ="Center" Height="25"/>
    
    </Grid>
    

    所以我唯一的好处是,我将

    分类
      

    Width =“{Binding ElementName = LeftColumnDefinition,Path = Width}”

    <ColumnDefinition Width="*" Name="LeftColumnDefinition" />

答案 3 :(得分:0)

一种方法是将TextBox的高度和宽度绑定到Window的高度和宽度,例如:

<TextBox Height={Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=Height} />

可能有一个不同的属性可能要绑定,或者您可能想要使用表达式,因此TextBox不是 父窗口的高度/宽度。很大程度上取决于您的具体使用场景,但这应该足以让您入门。