如何使用RowDefinition名称设置Grid Row?

Lai*_*290 4 wpf grid

我正在用RowDefinitions和组织我的网格ColumnDefinition,但是当我想要RowDefinition在实际任何之前添加新的时RowDefinition,我需要重新组织所有控件的Grid.Row

我看到RowDefinitionColumnDefinition有一个Name属性,所以我认为可以定义Grid.Row的RowDefinition名称与否?如果可能,怎么做

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Name="RowDictTitle" Height="27"/>
        <RowDefinition Name="RowSearchWord" Height="27"/>
        <RowDefinition/>
        <RowDefinition Height="50"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="2*"/>
    </Grid.ColumnDefinitions>

    <!--Row 1-->
    <TextBlock Text="Word?" VerticalAlignment="Center" Margin="10,0,0,0" Grid.Row="1"/>
    <TextBox Name="Search" Grid.ColumnSpan="2" Margin="50,2,10,2"/>

    <!--Row 2-->
    <ListBox Name="Words" Grid.Row="2" Margin="10"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)

我想在下面做

<TextBlock Text="Word" Grid.Row="RowSearchWord"/>
Run Code Online (Sandbox Code Playgroud)

F-H*_*F-H 6

免责声明:这个答案是一种自我广告,受到这篇元文章所暗示的约束.它宣传了一个免费的开源项目,我(在撰写本文时)并没有赚到任何钱.唯一的好处就是我知道如果能够帮助未来的访问者提出这个问题,那么我编写所描述控件的时间就不会浪费.

我有完全相同的想法.这就是为什么,不久前,我写了一个使用命名列和行的自定义网格类.

我把它放在MIT许可下的Codeplex:基于名称的网格项目

使用该控件,您可以按如下方式重写Xaml源代码:

<nbg:NameBasedGrid>
    <nbg:NameBasedGrid.RowDefinitions>
        <nbg:ColumnOrRow Name="RowDictTitle" Height="27"/>
        <nbg:ColumnOrRow Name="RowSearchWord" Height="27"/>
        <nbg:ColumnOrRow Name="List"/>
        <nbg:ColumnOrRow Height="50"/>
    </nbg:NameBasedGrid.RowDefinitions>
    <nbg:NameBasedGrid.ColumnDefinitions>
        <nbg:ColumnOrRow Width="1*" Name="Left"/>
        <nbg:ColumnOrRow Width="2*" Name="Right"/>
    </nbg:NameBasedGrid.ColumnDefinitions>

    <!--Row 1-->
    <TextBlock Text="Word?" VerticalAlignment="Center" Margin="10,0,0,0" nbg:NameBasedGrid.Column="Left" nbg:NameBasedGrid.Row="RowSearchWord"/>
    <TextBox Name="Search" nbg:NameBasedGrid.Column="Left" nbg:NameBasedGrid.Row="RowDictTitle" nbg:NameBasedGrid.ExtendToColumn="Right" Margin="50,2,10,2"/>

    <!--Row 2-->
    <ListBox Name="Words" nbg:NameBasedGrid.Column="Left" nbg:NameBasedGrid.Row="List" Margin="10"/>
</nbg:NameBasedGrid>
Run Code Online (Sandbox Code Playgroud)

优点:您可以按名称引用列和行(包括列和行跨度!) - 不再计算列或行,在布局更改时不再更新列或行跨度.

缺点:您需要显式声明所有列和行的名称,因为根本不支持数字引用NameBasedGrid.


gra*_*tnz 2

好主意,但由于 Grid.Row 附加属性是一个整数,这是不可能的。

请参阅http://msdn.microsoft.com/en-us/library/system.windows.controls.grid.row.aspx

但是,可以创建一个助手来获取网格行的名称,查找行对象并返回其行索引。