WPF - 调整网格中的列和行的大小

时间:2010-07-18 16:14:04

标签: wpf forms grid resize

好的,我正在使用网格列出各种内容。如何在其他人保持固定的情况下获取特定的colums来调整大小。

也就是说,表单会弹出控件的特定初始列大小...如果用户调整表单...我希望某些“备忘录”字段可以展开。怎么做?我似乎只能让所有'第二'列扩展到高度...不只是1(最后一个)......或特定的。

感谢您的帮助!!

这是布局......如何使用表单调整大小来调整“长”文本的大小,并将按钮粘贴到表单的底部? TX

<DockPanel VerticalAlignment="Top">
    <Grid DockPanel.Dock="Top" VerticalAlignment="Top" HorizontalAlignment="Stretch" Grid.Column="0" Margin="10,10,10,10" >
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
        <ColumnDefinition MinWidth="150" ></ColumnDefinition>        
      </Grid.ColumnDefinitions>

      <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition MinHeight="80" Height="Auto"></RowDefinition>
        <RowDefinition ></RowDefinition>
      </Grid.RowDefinitions>

      <Label Grid.Column="0" Grid.Row="0" Content="Test1"/>
      <Label Grid.Column="0" Grid.Row="1" Content="Test2 -Long notes"/>
      <Label Grid.Column="0" Grid.Row="2" Content="Test3"/>

      <TextBox Height="Auto" Grid.Column="1" Grid.Row="0" />
      <TextBox Height="Auto" Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />
      <TextBox Height="Auto" Grid.Column="1" Grid.Row="2" />

    </Grid>
    <StackPanel DockPanel.Dock="Bottom" Orientation="Horizontal" HorizontalAlignment="Right" MinHeight="20" Margin=" 0,0,10,10">
      <Button Content="OK" Margin="0,0,10,0" Width="75" IsDefault="True"/>
      <Button Content="Cancel" Width="75" IsCancel="True" />
    </StackPanel>
  </DockPanel>

(在第一次“回答”之后添加) 现在,如果我删除底部堆栈面板(确定,取消按钮)超出方程式,以使这更容易,我将第1和第2行设置为固定值...我似乎能够使这工作(不要必须设置最大高度)...哦,我需要将verticalAlignment更改为'stretch'。但是,只要我再次为按钮添加StackPanel ......拉伸不再有效......所以这是下一个修订版......

<DockPanel VerticalAlignment="Stretch">
    <Grid DockPanel.Dock="top"  VerticalAlignment="Stretch" Grid.Column="0"  Margin="10,10,10,10" >
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"></ColumnDefinition>
            <ColumnDefinition MinWidth="150" Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>

        <Grid.RowDefinitions>
            <RowDefinition MaxHeight="30"></RowDefinition>
            <RowDefinition MinHeight="80" Height="*"></RowDefinition>
            <RowDefinition MaxHeight="30"></RowDefinition>
        </Grid.RowDefinitions>

        <Label Grid.Column="0" Grid.Row="0" Content="Test1"/>
        <Label Grid.Column="0" Grid.Row="1" Content="Test2 -Long notes"/>
        <Label Grid.Column="0" Grid.Row="2" Content="Test3"/>

        <TextBox Grid.Column="1" Grid.Row="0" />
        <TextBox Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />
        <TextBox Grid.Column="1" Grid.Row="2" />
    </Grid>

    <StackPanel DockPanel.Dock="Bottom" VerticalAlignment="Bottom" HorizontalAlignment="Right" Orientation="Horizontal" MinHeight="20" Margin=" 0,0,10,10">
        <Button Content="OK" Margin="0,0,10,0" Width="75" IsDefault="True"/>
        <Button Content="Cancel" Width="75" IsCancel="True" />
    </StackPanel>
</DockPanel>

所以我还有问题...

3 个答案:

答案 0 :(得分:3)

使用*作为列宽而不是Auto,它告诉列占用其他列设置后留下的任何空间。

如果您需要多个列以不同的百分比共享可用空间,则可以在*前加上一个数字,如“2 *”和“3 *”。默认情况下,“”表示1

HTH,
Berryl

答案 1 :(得分:0)

我似乎只能通过在自己的网格行和列中包含StackPanel来解决问题。这是我的解决方案。在这种情况下不确定是否需要停靠面板...但是没有更多的修补......这是我目前的解决方案。如果任何人可以向我解释如何让它与堆栈面板一起使用确定,取消按钮“在网格外”,我很想知道。同时,这个解决方案适用于那些研究此类问题的人。如您所见,您需要在所有其他行定义中使用Auto。 *你希望它扩展的地方。

<DockPanel VerticalAlignment="Stretch">
        <Grid DockPanel.Dock="top"  VerticalAlignment="Stretch" Grid.Column="0"  Margin="10,10,10,10" >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"></ColumnDefinition>
                <ColumnDefinition MinWidth="150" Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>

            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition MinHeight="80" Height="*"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
                <RowDefinition Height="Auto"></RowDefinition>
            </Grid.RowDefinitions>

            <Label Grid.Column="0" Grid.Row="0" Content="Test1"/>
            <Label Grid.Column="0" Grid.Row="1" Content="Test2 -Long notes"/>
            <Label Grid.Column="0" Grid.Row="2" Content="Test3"/>

            <TextBox Grid.Column="1" Grid.Row="0" />
            <TextBox Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />
            <TextBox Grid.Column="1" Grid.Row="2" />

            <StackPanel Grid.Column="1" Grid.Row="3" VerticalAlignment="Bottom" HorizontalAlignment="Right" Orientation="Horizontal" MinHeight="20" Margin=" 0,10,0,0">
                <Button Content="OK" Margin="0,0,10,0" Width="75" IsDefault="True"/>
                <Button Content="Cancel" Width="75" IsCancel="True" />
            </StackPanel>
        </Grid>
    </DockPanel>

答案 2 :(得分:0)

如果您希望只能重新调整行和列定义所形成的一个正方形的大小,则应在正方形中添加一个网格或任何容器元素。然后你将使方格内的网格相应地重新调整大小。这样所有的定义都不会重新调整大小,而是网格和它内部的元素将重新调整大小,从而不会改变其他元素。这种情况并不常见,但您可以拥有尽可能多的堆叠面板和网格,并在需要时设置其可见性。有时当某些东西不起作用时,将它们粘贴在其他东西中并进行实验。你可能偶然得到它,但你仍然可以得到它。