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

本文关键字:更新 按钮 位置 网格 wpf | 更新日期: 2023-09-27 17:55:06

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

的例子:

b1 b2 b3

b5 b6

b7 b8 b9

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

b1 b2 b3

b4 b6 b7

b8 b9

当前在可见性更新处理程序中,我正在检查所有控件状态和更改网格。行,网格,列。有更好的方法吗?

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

根据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>

背后代码:

    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;
            }
        }
    }

尝试UniformGrid,并将Columns and Rows设置为3。它会按照你刚才描述的方式自动填充网格。