是否有WPF列和行定义的简写?

时间:2012-03-02 15:24:56

标签: wpf

我有一个简单的网格布局,只是托管多个标签和文本框。第一列中的标签,第二列中的框。

每当我添加一个新框时,我都必须在我的<RowDefinition />块中添加一个空的<Grid.RowDefinitions>以允许它占用一个新行。由于我没有附加到这些行的任何样式,是否有某种速记可以防止不得不这样做?

<Grid.ColumnDefinitions>
  <ColumnDefinition Width="65" />
  <ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
  <RowDefinition />
  <RowDefinition />
  <RowDefinition />
  <RowDefinition />
  <RowDefinition />
  <RowDefinition />
  <RowDefinition />
  <RowDefinition />
  <RowDefinition />
</Grid.RowDefinitions>

3 个答案:

答案 0 :(得分:4)

不,没有简短的方法,但您可以编写自己的解决方案,或使用已有人的框架。

例如,CODE framework允许您定义标记,如清单6 here所示。这使用自定义面板大大简化了常见编辑表单的定义。

您可以下载source并查看其实施情况,并根据您的需求进行定制。

答案 1 :(得分:2)

您可以继承Grid并添加您需要的任何行为。

HereAutoGrid的一种实现,可自动为任何AutoGridEndRow对象插入新行,并且只要Grid.Row大于当前定义计数。

用法如下:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:WpfApplication1"
        Title="Window1" Height="300" Width="300">
  <my:AutoGrid>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="65" />
      <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Label Content="Label1" />
    <TextBox Grid.Column="1" />
    <my:AutoGridEndRow />

    <Label Content="Label1" />
    <TextBox Grid.Column="1" />

  </my:AutoGrid>
</Window>

答案 2 :(得分:1)

您可以使用附加属性自行创建简写语法。

我在这里创建了一个示例:https://github.com/thomasclaudiushuber/Wpf-Grid-Extensions

它允许您编写以下内容:

<Grid local:GridExtensions.Structure="*,100|200,*">

</Grid>

在幕后它创建了这个:

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="*"/>
    <RowDefinition Height="100"/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="200"/>
    <ColumnDefinition Width="*"/>
  </Grid.ColumnDefinitions>

</Grid>