Обновлять расположение кнопки автоматически в сетке wpf - PullRequest
0 голосов
/ 05 мая 2011

У меня есть сетка 3 * 3 и 9 кнопок. Доступность этих кнопок определяется во время выполнения, поэтому кнопка должна располагаться в доступном пространстве.

пример:

b1, b2, b3

b4, b5, b6

b7 b8 b9

если кнопка b5 недоступна, тогда я должен сделать это

b1, b2, b3

b4, b6, b7

b8, b9

В настоящее время в обработчике обновления видимости я проверяю все элементы управления и меняю grid.row и grid.column. Есть ли лучший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 05 мая 2011

После ответа 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;
            }
        }
    }
0 голосов
/ 05 мая 2011

Попробуйте UniformGrid и установите Столбцы и строки в 3. Он автоматически заполнит сетку так, как вы только что описали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...