web-dev-qa-db-ja.com

XMLでテーブルまたはグリッドを定義する理想的な方法は?

HTML

<table border="1" width="400">
  <tr>
    <th>Month</th>
    <th>Savings</th>
  </tr>
  <tr>
    <td>January</td>
    <td>$100</td>
  </tr>
  <tr>
    <td>February</td>
    <td>$80</td>
  </tr>
</table>

XAML

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="28" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <Label Grid.Row="0" Grid.Column="0" Content="Name:"/>
    <Label Grid.Row="1" Grid.Column="0" Content="E-Mail:"/>
    <Label Grid.Row="2" Grid.Column="0" Content="Comment:"/>
    <TextBox Grid.Column="1" Grid.Row="0" Margin="3" />
    <TextBox Grid.Column="1" Grid.Row="1" Margin="3" />
    <TextBox Grid.Column="1" Grid.Row="2" Margin="3" />
    <Button Grid.Column="1" Grid.Row="3" HorizontalAlignment="Right" 
            MinWidth="80" Margin="3" Content="Send"  />
</Grid>

HTMLでは、列の幅を設定する方法にあいまいさがあります。 th/tdで指定する必要がありますが、同じ列内に複数あります。

WPFは「定義」を導入することでこの問題を解決しますが、各要素を挿入するセルを明示的に指定する必要があり、多くのマークアップが追加されます。また、セルを見逃したり、2つの要素を同じセルに入れようとしたりするとどうなりますか?

このようなものはどうですか?

<grid>
    <coldefs>
        <coldef width="150" />
        <coldef width="100" />
    </coldefs>
    <rowdefs>
        <rowdef height="50" />
        <remainingrowdef height="auto" />
    </rowdef>

    <cell>Month</cell>
    <cell>Savings</cell>
    <cell>January</cell>
    <cell>$100</cell>
    <cell>February</cell>
    <cell>$80</cell>
</grid>

セルが左から右、上から下に塗りつぶされるところはどこですか?長所短所?その他のオプション?


さらに良いことに、フィルオーダーも指定できます!引数を追加するだけです<grid fill_order="left-right,top-bottom">

1
mpen

HTMLとXAMLの例を簡単に導き出すことができるように、適切なテーブル定義はXSLTに非常によく適合するはずだと思います。あなたの提案は良さそうです、多分これは変換するのがより簡単でしょう:

<grid>
    <coldefs>
        <coldef width="150" />
        <coldef width="100" />
    </coldefs>
    <rowdef height="auto" />

    <row height="50">
        <cell>Month</cell>
        <cell>Savings</cell>
    </row>
    <row>
        <cell>January</cell>
        <cell>$100</cell>
    </row>
    <row>
        <cell>February</cell>
        <cell>$80</cell>
    </row>
</grid>
2