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

时间:2011-05-05 11:57:07

标签: c# wpf grid

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

示例:

b1 b2 b3

b4 b5 b6

b7 b8 b9

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

b1 b2 b3

b4 b6 b7

b8 b9

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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