0

Доброго времени суток.

У меня есть Grid 5x5 в каждой ячейке которого находятся кнопки. Нужно чтобы при нажатии на кнопку менялся его цвет.

Сейчас делаю так:

XAML

<Grid Name="field" Tag="gameField" Margin="6,60,386,0" Height="400" VerticalAlignment="Top">
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Button x:Name="button00" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="0" Grid.Column="0" Click="button_Click"/>
        <Button x:Name="button01" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="0" Grid.Column="1" Click="button_Click"/>
        <Button x:Name="button02" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="0" Grid.Column="2" Click="button_Click"/>
        <Button x:Name="button03" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="0" Grid.Column="3" Click="button_Click"/>
        <Button x:Name="button04" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="0" Grid.Column="4" Click="button_Click"/>

        <Button x:Name="button10" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="1" Grid.Column="0" Click="button_Click"/>
        <Button x:Name="button11" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="1" Grid.Column="1" Click="button_Click"/>
        <Button x:Name="button12" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="1" Grid.Column="2" Click="button_Click"/>
        <Button x:Name="button13" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="1" Grid.Column="3" Click="button_Click"/>
        <Button x:Name="button14" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="1" Grid.Column="4" Click="button_Click"/>

        <Button x:Name="button20" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="2" Grid.Column="0" Click="button_Click"/>
        <Button x:Name="button21" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="2" Grid.Column="1" Click="button_Click"/>
        <Button x:Name="button22" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="2" Grid.Column="2" Click="button_Click"/>
        <Button x:Name="button23" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="2" Grid.Column="3" Click="button_Click"/>
        <Button x:Name="button24" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="2" Grid.Column="4" Click="button_Click"/>

        <Button x:Name="button30" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="3" Grid.Column="0" Click="button_Click"/>
        <Button x:Name="button31" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="3" Grid.Column="1" Click="button_Click"/>
        <Button x:Name="button32" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="3" Grid.Column="2" Click="button_Click"/>
        <Button x:Name="button33" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="3" Grid.Column="3" Click="button_Click"/>
        <Button x:Name="button34" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="3" Grid.Column="4" Click="button_Click"/>

        <Button x:Name="button40" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="4" Grid.Column="0" Click="button_Click"/>
        <Button x:Name="button41" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="4" Grid.Column="1" Click="button_Click"/>
        <Button x:Name="button42" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="4" Grid.Column="2" Click="button_Click"/>
        <Button x:Name="button43" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="4" Grid.Column="3" Click="button_Click"/>
        <Button x:Name="button44" Content="" HorizontalAlignment="Left" VerticalAlignment="Top" Width="80" Height="80" Grid.Row="4" Grid.Column="4" Click="button_Click"/>

    </Grid>

C#

private void button_Click(Object sender, RoutedEventArgs e)
    {
        Button[,] Field = new Button[5, 5] { {button00, button01, button02,  button03,  button04},
                                             {button10, button11, button12,  button13,  button14},
                                             {button20, button21, button22,  button23,  button24},
                                             {button30, button31, button32,  button33,  button34},
                                             {button40, button41, button42,  button43,  button44}
                                          };

        for (int i = 0; i < 5; i++)
        {
            for (int j = 0; j < 5; j++)
            {
                if (Field[i, j] == sender)
                {
                 Field[i, j].Background = Brushes.Red;
                }
            }
        }
    }

Хотелось бы узнать, можно ли как-то записывать кнопки в подобный массив(возможно даже больших размеров) не зная имён кнопок, ибо при большом количестве кнопок прописывать всё в ручную будет не очень удобно.

Спасибо за внимание.

ThusMad
  • 371
  • Если ваш код начинает включать часто повторяющиеся элементы, то этот код в 90% случаев можно улучшить. Чтобы не повторять кнопки подряд, можно использовать привязки. Чтобы не вешать на них обработчики, можно повесить один обработчик на Grid. – Alex Krass Jun 20 '18 at 07:30
  • Почему бы просто не (sender as Button).Background = .....;? – tym32167 Jun 20 '18 at 07:44
  • Зря вопрос отметили как дубликат. Вопрос ведь не про создание кнопок, а про создание массива на основе ранее созданных кнопок, т.е. вообще про другое. Правда, автор сам виноват, что не смог правильно сформулировать свой вопрос. Я уж и ответ почти подготовил... – Bulson Jun 20 '18 at 09:01
  • 1
    @ThusMad, вам проще будет использовать UniformGrid, создавать кнопки динамически можно как из вопроса дубликата используя ItemsControl + цикл, вешать на UniformGrid обработчик PreviewMouseLeftButtonUp и через свойство Children у UniformGrid выбирать кнопки, через количество Rows и Columns вычислять их позицию в двумерном массиве. В таком случае вы избавитесь от повторения кода. – Alex Krass Jun 20 '18 at 09:13
  • @Bulson Я вообще считаю, что данный подход из 30 кнопок в View неверным. Также я считаю, что WPF это априори Binding и MVVM, а не обращение к контролам из кода и тем более не занесение этих контролов в массивы для "удобной работы с ними". Вопрос о том, как занести кнопки в коллекцию, я в том ответе по правилам MVVM все расписал (и как создать коллекцию и как вывести эти кнопки). – EvgeniyZ Jun 20 '18 at 13:02
  • @EvgeniyZ сам подход в создании интерфейса проги может и неверный, опять же на чей-то взгляд, но дело то не в этом. Автор хотел получить подсказку как на основании существующей коллекции контролов оптимальным образом работать с ними в кодбихайнд. А вы выступаете, как религ. фанатик какого-то одного подхода, истинно говорю вам кто уверует в " Binding и MVVM" тот спасется, остальные сгорят в гиене огненной. Так вы угробите вариативность подходов, вопросов и в конечном итоге полезность SO rus. – Bulson Jun 20 '18 at 13:35
  • @Bulson Вы называете это "религией" а я называю это неграмотностью. Я могу вам пачку вопросов дать по WPF, где люди после WinForms такие костыли изобретают (один помню проект скинул, так там все на if/else, без привязок и реализация путем скрытия/показа контролов через код), что у меня сердце останавливается. Этот вопрос в их числе. Так зачем нам заведомо неверный подход? Можно же научить человека правильному подходу, а не помогать в реализации "костыля". В этом будет больше пользы как для автора, так и для будущих пользователей! – EvgeniyZ Jun 20 '18 at 13:56
  • @EvgeniyZ Можно еще один вопрос? Я переписал свое приложение под MVVM, и столкнулся с одной проблемой. Можно ли как-то в RelayCommand получить обьект(тоесть мою кнопку) коротая вызывает его, чтобы при нажатии на кнопку красить её в другой цвет? – ThusMad Jun 20 '18 at 18:39
  • 1
    @ThusMad Конечно! Задайте дополнительно то, что вы будете передавать командой с помощью параметра (указав к примеру CommandParameter = "{Binding}"). Только по правилам MVVM вы не должны думать о кнопке, как о контроле. Думайте о VM данной кнопки, которая содержит необходимые свойства (которые привязаны к кнопке), а не о самой кнопке. Если хотите задать цвет и вы сделали все по тому ответу, то в ButtonViewModel добавьте новое свойство содержащее цвет, и его привяжите. – EvgeniyZ Jun 20 '18 at 18:52
  • @ThusMad Как вы задаете RelayCommand? – EvgeniyZ Jun 20 '18 at 19:06
  • @EvgeniyZ как здесь https://metanit.com/sharp/wpf/22.3.php – ThusMad Jun 20 '18 at 19:08
  • @ThusMad Если как там, то примерно так. Кнопке в XAML задаем Command="{Binding Command}" CommandParameter="{Binding}" Background="{Binding Color}"". – EvgeniyZ Jun 20 '18 at 19:24
  • 1
    @EvgeniyZ Спасибо вам большое). Всё работает – ThusMad Jun 20 '18 at 19:31

0 Answers0