WPF中网格的隐式RowDefinition

时间:2013-11-21 09:52:05

标签: c# wpf xaml wpfdatagrid

在XAMl中设计网格时,我们必须明确告知网格中有多少行。

让我们假设我们正在制作表单类型的应用程序。用户需要填写其中的信息。有一个标签,然后有一个文本框。这个重复了10次。

<Label Content="Name" />
<TextBox Text={Binding SomethingText"} />

现在这将重复。现在我在这里定义一个网格。

1  <Grid>
2      <Grid.ColumnDefinitions>
3          <ColumnDefinition Width="60" />
4          <ColumnDefinition Width="*" />
5      </Grid.ColumnDefinitions>
6      <Grid.RowDefinitions>
7          <RowDefinition Height="Auto" />
8          <RowDefinition Height="Auto" />
9      </Grid.RowDefinitions>

10     <Label Grid.Row="0" Grid.Column="0" Content="Name" />
11     <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding SomethingText}" />

12     <Label Grid.Row="1" Grid.Column="0" Content="Address" />
13     <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding SomeText}" />
14  </Grid>

现在,如果我决定在网格中添加另一行。更改Grid.Row =“2”将无法正常工作。它将与Row1重叠。为了正常工作,我需要在Grid.RowDefinitions中添加一个RowDefinition。所以每次我都需要添加RowDefinition。

现在我的问题是,无论如何我都不需要明确告诉RowDefinitions。 WPF自动使用最后一个RowDefinition(行号8)。

所以我想要这样的输出。没有额外的RowDefinitions。有可能吗?

1  <Grid>
2      <Grid.ColumnDefinitions>
3          <ColumnDefinition Width="60" />
4          <ColumnDefinition Width="*" />
5      </Grid.ColumnDefinitions>
6      <Grid.RowDefinitions>
7          <RowDefinition Height="Auto" />
8          
9      </Grid.RowDefinitions>

10     <Label Grid.Row="0" Grid.Column="0" Content="Name" />
11     <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding SomethingText}" />

12     <Label Grid.Row="1" Grid.Column="0" Content="Address" />
13     <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding SomeText}" />

14     <Label Grid.Row="2" Grid.Column="0" Content="Address" />
15     <TextBox Grid.Row="2" Grid.Column="1" Text="{Binding SomeText}" />

16     <Label Grid.Row="3" Grid.Column="0" Content="Address" />
17     <TextBox Grid.Row="3" Grid.Column="1" Text="{Binding SomeText}" />
14  </Grid>

1 个答案:

答案 0 :(得分:1)

改为创建UserControl,然后在StackPanelDockpanel中重复一遍:

<UserControl ...>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="60" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Label x:Name="label" Grid.Row="0" Grid.Column="0"/>
        <TextBox x:Name="textBox" Grid.Row="0" Grid.Column="1"/>
    </Grid>
</UserControl>

然后在您看来,使用DockPanel

<DockPanel>
    <c:YourUserControl DockPanel.Dock="Top" Label="Name" Value="{Binding SomethingText}"/>
    <c:YourUserControl DockPanel.Dock="Top" Label="Address" Value="{Binding SomeText}"/>
</DockPanel>

StackPanel

<StackPanel>
    <c:YourUserControl Label="Name" Value="{Binding SomethingText}"/>
    <c:YourUserControl Label="Address" Value="{Binding SomeText}"/>
</StackPanel>