C# 在网格wpf中自动更新按钮位置

C# 在网格wpf中自动更新按钮位置,c#,wpf,grid,C#,Wpf,Grid,我有3*3的网格,里面有9个按钮。这些按钮的可用性是在运行时确定的,所以按钮必须安排在可用空间中 例如: b1 b2 b3 b4 b5 b6 b7 b8 b9 如果b5按钮不可用,那么我必须这样做 b1 b2 b3 b4 b6 b7 b8 b9 当前,在Visibly更新处理程序中,我正在检查所有控件的状态并更改grid.row和grid.column。有更好的方法吗?按照Bala R的回答,您似乎正在尝试实现自己的WrapPanel 有一个内置的WrapPanel,它可以自动地重新排列控件“从

我有3*3的网格,里面有9个按钮。这些按钮的可用性是在运行时确定的,所以按钮必须安排在可用空间中

例如:

b1 b2 b3

b4 b5 b6

b7 b8 b9

如果b5按钮不可用,那么我必须这样做

b1 b2 b3

b4 b6 b7

b8 b9


当前,在Visibly更新处理程序中,我正在检查所有控件的状态并更改grid.row和grid.column。有更好的方法吗?

按照Bala R的回答,您似乎正在尝试实现自己的WrapPanel

有一个内置的WrapPanel,它可以自动地重新排列控件“从左到右,然后从上到下”或“从上到下,然后从左到右”。然后你就不需要再“观察”你的按钮的可见性了,因为一旦一个按钮不可见(折叠),其他按钮就会立即占据后面的位置,然后再按照上面描述的模式操作

下面是一个快速而肮脏的示例,请随意使用WrapPanel方向和折叠/隐藏按钮状态:

XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="31*" />
        <RowDefinition Height="731*" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="284*" />
        <ColumnDefinition Width="294*" />
    </Grid.ColumnDefinitions>
    <StackPanel Orientation="Horizontal"  VerticalAlignment="Top">
        <Button x:Name="hideBtn" Content="HIDE button #" Click="hideBtn_Click"></Button>
        <TextBox x:Name="buttonNumber" Width="50"></TextBox>
        <RadioButton x:Name="radioCollapsed" Content="Collapsed" IsChecked="True"></RadioButton>
        <RadioButton x:Name="radioHidden" Content="Hidden"></RadioButton>
    </StackPanel>

    <WrapPanel x:Name="wp" Orientation="Horizontal"  Grid.Row="1" VerticalAlignment="Top" HorizontalAlignment="Left" Height="74" Width="61">
        <Button x:Name="b_1" Content="B1"></Button>
        <Button x:Name="b_2" Content="B2"></Button>
        <Button x:Name="b_3" Content="B3"></Button>
        <Button x:Name="b_4" Content="B4"></Button>
        <Button x:Name="b_5" Content="B5"></Button>
        <Button x:Name="b_6" Content="B6"></Button>
        <Button x:Name="b_7" Content="B7"></Button>
        <Button x:Name="b_8" Content="B8"></Button>
        <Button x:Name="b_9" Content="B9"></Button>
    </WrapPanel>
</Grid>

尝试UniformGrid并将列和行设置为3。它将按照您刚才描述的方式自动填充网格。

您是否考虑过使用a而不是网格?@Bala+1这似乎正是包裹面板的功能
    private void hideBtn_Click(object sender, RoutedEventArgs e)
    {
        foreach (var child in wp.Children)
        {
            var btn = (Button)child;
            btn.Visibility = Visibility.Visible;
        }
        foreach (var child in wp.Children)
        {
            var btn = (Button)child;

            if (btn.Name.Contains(buttonNumber.Text))
            {
                if (radioCollapsed.IsChecked.Value)
                    btn.Visibility = Visibility.Collapsed;
                else
                    btn.Visibility = Visibility.Hidden;
            }
        }
    }