.net 为什么WPF网格对行和列使用附加属性?

.net 为什么WPF网格对行和列使用附加属性?,.net,wpf,.net,Wpf,在WPF中,如果我想使用网格布局,我需要设置行和列定义 <Grid> <Grid.RowDefinitions> <RowDefinition Height="100" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDe

在WPF中,如果我想使用网格布局,我需要设置行和列定义

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="100" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

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

    <!-- Cell data goes here -->
</Grid>
这至少造成了两个我能想到的问题:

  • 如果我有一堆行,并且希望在第一行之后插入一些内容,那么我需要为第二行之后的所有项目重新分配
    Grid.row
  • 如果我决定隐藏一行(例如,基于用户是否具有特定权限),该行仍将占用相同的空间
  • 这种使用附加属性来显式注释网格中每个元素的位置的方法与HTML方法不同,HTML方法按顺序定义行和单元格:

    <table>
        <tr><td>Name:</td><td>John</td></tr>
        <tr><td>Age:</td><td>15</td></tr>
    </table>
    
    
    姓名:约翰
    年龄:15
    
    在HTML中,上述场景非常容易处理。您可以通过以下方式插入新行。。。插入它:

    <table>
        <tr><td>Title:</td><td>Mr.</td></tr> <!-- insert win -->
        <tr><td>Name:</td><td>John</td></tr>
        <tr><td>Age:</td><td>15</td></tr>
    </table>
    
    
    标题:李先生。
    姓名:约翰
    年龄:15
    
    …并在…旁边删除一行。。。删除它:

    <table>
        <tr><td>Title:</td><td>Mr.</td></tr> <!-- insert win -->
        <tr><td>Name:</td><td>John</td></tr>
        <!-- no more age! and it doesn't take up space any more either -->
    </table>
    
    
    标题:李先生。
    姓名:约翰
    

    我非常清楚WPF与HTML有很大的不同。为什么WPF设计者采用这种方法?有什么方法可以解决上述问题吗?

    这确实是一件非常烦人的事情

    在需要将项目一个堆叠在另一个之下的场景中,我只使用StackPanel。 但如果您真的想要网格功能,有一个非常简洁的解决方案:

    使用“自动栅格ID”可以定义行数和列数,添加到栅格的每个图元都会自动指定一个行值和列值:

    <AutoGrid RowCount="2" RowHeight="35" Columns="100,auto">
      <Label />
      <TextBox />
      <Label />
      <TextBox />
    </AutoGrid>
    

    与AutoGrid不同的是,
    ,它实际上包含在框架中。

    这确实是一件非常烦人的事情

    在需要将项目一个堆叠在另一个之下的场景中,我只使用StackPanel。 但如果您真的想要网格功能,有一个非常简洁的解决方案:

    使用“自动栅格ID”可以定义行数和列数,添加到栅格的每个图元都会自动指定一个行值和列值:

    <AutoGrid RowCount="2" RowHeight="35" Columns="100,auto">
      <Label />
      <TextBox />
      <Label />
      <TextBox />
    </AutoGrid>
    

    与AutoGrid不同的是,
    ,它实际上包含在框架中。

    这只是为了更多规范而权衡权力的另一个例子。您可以在WPF中对网格进行更多的控制,但代价是必须指定更多的属性。您不需要在HTML中指定太多内容,因为它会假设您将如何使用该标记,这可能是好的,也可能是坏的。如果我不希望所有行在默认情况下具有相同的高度,该怎么办?在HTML中声明“星形符号”会有多困难

    然而,我不认为这有你想象的那么不同。为了动态隐藏该HTML 行,您必须将
    显示设置为
    ,在WPF中,您必须将
    可见性设置为
    折叠
    ,并更改
    行定义
    高度

    设计师采用这种方法的原因是,它确实允许更大的灵活性-
    Grid
    主要是一个布局管理器,而不是一个表显示。attached properties方法提供了(同样是以必须指定更多属性为代价的)更多的控制,这对于布局管理器来说很重要(尽管如果您曾经使用过GUI,它们有时会让您感到痛苦)


    此外,为了向网格动态添加行以显示数据,您可能不会使用
    网格
    ,而是
    数据网格
    。您还可以使用
    UniformGrid
    ,它类似于HTML的表(尽管它仍然是一个布局管理器)。还有一个
    类。

    这只是另一个为了更多规范而权衡权力的例子。您可以在WPF中对网格进行更多的控制,但代价是必须指定更多的属性。您不需要在HTML中指定太多内容,因为它会假设您将如何使用该标记,这可能是好的,也可能是坏的。如果我不希望所有行在默认情况下具有相同的高度,该怎么办?在HTML中声明“星形符号”会有多困难

    然而,我不认为这有你想象的那么不同。为了动态隐藏该HTML 行,您必须将
    显示设置为
    ,在WPF中,您必须将
    可见性设置为
    折叠
    ,并更改
    行定义
    高度

    设计师采用这种方法的原因是,它确实允许更大的灵活性-
    Grid
    主要是一个布局管理器,而不是一个表显示。attached properties方法提供了(同样是以必须指定更多属性为代价的)更多的控制,这对于布局管理器来说很重要(尽管如果您曾经使用过GUI,它们有时会让您感到痛苦)


    此外,为了向网格动态添加行以显示数据,您可能不会使用
    网格
    ,而是
    数据网格
    。您还可以使用
    UniformGrid
    ,它类似于HTML的表(尽管它仍然是一个布局管理器)。还有一个
    类。

    如果不使用附加属性,如何设置行和列值?您的示例无效,因为XAML远离HTML。您刚刚在单元格中添加了一个
    字符串
    ,但实际上在XAML中,你可以在每个单元格中添加几百行,因此你很快就会在所有单元格内容中丢失
    网格
    定义。就像HTML那样-使用行和单元格容器。HTML表格不是主要是数据表示控件而不是布局控件吗?那么更合适的比较将是DataGrid,而不是Grid。我曾经用WPF制作桌面应用程序。现在,我几乎只制作web应用程序。看到有人抱怨网格的工作方式与HTML表格不同,我感到很痛苦。在我看来,HTML中可用的布局选项与WPF相比是可怜的。W