【问题标题】:How to make textbox resize as the window resize如何使文本框随着窗口调整大小而调整大小
【发布时间】:2019-11-03 00:01:28
【问题描述】:

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

    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。它也可以通过 Grid 实现,但标记会更加混乱。如果您是 WPF 新手,我强烈建议您使用各种可用的面板。一旦您了解了何时将特定面板应用于特定布局,它会使 WPF 更易于使用。

    【讨论】:

      【解决方案2】:

      由于限制很少,这可能有点棘手。

      1. 文本框不能自动放置宽度(在我的情况下,如果有人复制粘贴长字符串,它会因为自动宽度而超出边界)。
      2. 我不能保持默认,因为在没有文本的情况下它的宽度非常小,所以我需要 MinWidth。
      3. 同时你必须有一个静态的宽度表示,因为我们想要为特定的行换行。

      我尝试了这个解决方案,它使您的宽度限制为父级(我同意也可以有更好的解决方案,但这很简单而且效果很好)

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

      &lt;ColumnDefinition Width="*" Name="LeftColumnDefinition" /&gt;

      【讨论】:

        【解决方案3】:

        有点晚了,但我想让大家知道。

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

        【讨论】:

        • 这个答案是错误的。 “自动”将使其成为所选文本大小的最小高度。
        • 我还必须设置:VerticalAlignment="Stretch" Horizo​​ntalAlignment="Stretch"
        【解决方案4】:

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

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

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

        【讨论】:

        • -1,WPF 中的布局非常简单,不需要像这样的解决方法。正确的方法是选择一个合适的面板,让 TextBox 按照它自然的方式调整大小。
        • 非常正确。我倾向于有一个自定义标签:文本框控件,有时必须通过这些值。当我需要它时,我花了一段时间来对抗上述情况。但绝对是,user496949,如果您的设计允许,请这样做。
        • 我之前已经完成了整个带标签的文本框控件。这是一种痛苦。您可能会发现避免绑定显式宽度的一个有用技巧是使每个标记的文本框包含一个 Grid,其中一个 Auto col 用于标签,一个 Star col 用于文本框。然后将它们全部放入 StackPanel 并在 StackPanel 上设置 Grid.IsSharedSizeScope="True"。所有标签都会对齐。
        • 喜欢乔希的评论,非常有用的提示! (几天前我刚开始使用 Grid.IsSharedSizeScope 属性,同时重新模板化 menuItems,这是 MS 那里的一项非常漂亮的工作,虽然棘手但非常有用!)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-18
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 2011-02-28
        • 1970-01-01
        • 2019-05-15
        相关资源
        最近更新 更多