在WPF中如何通过行和列获取网格子项?

6
<Grid x:Name="LayoutRoot" HorizontalAlignment="Center" VerticalAlignment="Center" >
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Button Width="150" Height="50" x:Name="Btn1" Content="Button1" Grid.Row="0" Grid.Column="0"/>
    <Button Width="150" Height="50" x:Name="Btn2" Content="Button2" Grid.Row="0" Grid.Column="1"/>
    <Button Width="150" Height="50" x:Name="Btn3" Content="Button3" Grid.Row="2" Grid.Column="0"/>
    <Button Width="150" Height="50" x:Name="Btn4" Content="Button4" Grid.Row="2" Grid.Column="1"/>
</Grid>

WPF中的C#代码
Visual childVisual = (Visual)VisualTreeHelper.GetChild(LayoutRoot,0);

使用上述代码可以获取网格(LayoutRoot)的第一个子元素。但我想按行或列获取网格的子元素。我该怎么做呢?
提前感谢。

通常情况下,您不应该使用VisualTreeHelper - H.B.
1个回答

19

根据每个子元素返回的 Grid.GetRowGetColumn 来过滤 Grid.Children

例如:

var itemsInFirstRow = LayoutRoot.Children
                          .Cast<UIElement>()
                          .Where(i => Grid.GetRow(i) == 0);

2
@ChandruA:看过这个例子了吗?无论如何,如果你需要查找UI元素,那么你可能做错了一些事情,你的代码可能需要更多的数据绑定和命令。参考链接:http://msdn.microsoft.com/en-us/library/ms752347.aspx 和 http://msdn.microsoft.com/en-us/library/system.windows.input.icommand.aspx。 - H.B.
var itemsInFirstRow = LayoutRoot.Children.Where(i => Grid.GetRow(i) == 0); 这段代码出现了错误。 - CHANDRA
你需要编写 LayoutRoot.Children.Cast<UIElement>().Where(i => Grid.GetRow(i) == 0) - Clemens
我同意H.B.的观点,这不是一个好的方法。如果以后网格中添加或删除了行或列,你或其他开发人员会记得或知道去更改那个硬编码的数字吗? - xr280xr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接