Генерация и размещение кнопок в сетке, ссылки по координатам x, y - PullRequest
1 голос
/ 11 ноября 2011

Мне нужно сгенерировать сетку кнопок, которые будут расположены на форме.Все кнопки будут выполнять один и тот же код, но должны иметь возможность идентифицировать назначенные значения x и y для нажатой кнопки.У меня есть 3 идеи о том, как этого добиться, но я не знаю, что было бы лучше.

  1. Я мог бы создать двумерный массив объектов кнопок и просто прочитать два индекса каккоординаты х и у.Это позволило бы мне легко назначить один и тот же код всем кнопкам, но он не настолько гибок, как массив.
  2. Я мог бы создать список из списка (список из осей x со списком yоси) и добавить к ним кнопки в зависимости от размера моей сетки.Я не верю, что есть способ назначить всем им один блок кода, не указывая каждый из них непосредственно на один и тот же обработчик событий (хотя я полагаю, что мог бы сделать указание во время генерации объекта кнопки).
  3. Создайте новый класс, в котором будут храниться кнопка, значение X и значение Y.Этот класс также будет содержать встроенную функциональность для обработки добавления / удаления по мере необходимости.

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

Ответы [ 2 ]

3 голосов
/ 12 ноября 2011

Вот простой код, который делает то, что вы хотите.Подключите все кнопки к одному и тому же обработчику событий в XAML

<Grid x:Name='gameboardGrid'>
    <Grid.RowDefinitions>
      <RowDefinition Height="1*"/>
      <RowDefinition Height="1*"/>
      <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="1*"/>
      <ColumnDefinition Width="1*"/>
      <ColumnDefinition Width="1*"/>
    </Grid.ColumnDefinitions>

<Button Content="Button"  Grid.Column="1" Click="AllButtons_Click"/>
<Button Content="Button" Grid.Column="0" Click="AllButtons_Click"/>
<Button Content="Button"  Grid.Column="2" Grid.Row="1" Click="AllButtons_Click"/>
<Button Content="Button"  Grid.Column="2" Click="AllButtons_Click"/>
        </Grid>

. Затем в обработчике щелчка получите координаты x, y относительно элемента LayoutRoot.

 private void AllButtons_Click(object sender, System.Windows.RoutedEventArgs e) {

  var b = sender as Button;
  // in order to remain hit testable, hide the element 
  // by setting its Opacity property, not the Visibility property

  // also note that semi transparent objects can affect performance
  b.Opacity = b.Opacity >= 1.0 ? 0.0 : 1.0; 
  var locationPoint = b.TransformToVisual(LayoutRoot).Transform(new Point());
  PageTitle.Text = String.Format("{0},{1}",locationPoint.X, locationPoint.Y) ;

}

РЕДАКТИРОВАТЬ

Если вы хотите сделать это без XAML.Вот XAML для сетки.

 <Grid x:Name='gameboardGrid'>
        <Grid.RowDefinitions>
          <RowDefinition Height="1*"/>
          <RowDefinition Height="1*"/>
          <RowDefinition Height="1*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="1*"/>
          <ColumnDefinition Width="1*"/>
          <ColumnDefinition Width="1*"/>
        </Grid.ColumnDefinitions>
</Grid>

Затем добавьте этот код для генерации кнопок.

public MainPage() {
  InitializeComponent();
  for (int rowCounter = 0; rowCounter < 3; rowCounter++) {
    for (int colCounter = 0; colCounter < 3; colCounter++) {
      var codeButton = new Button();
      Grid.SetRow(codeButton, rowCounter);
      Grid.SetColumn(codeButton, colCounter);

      codeButton.Click += new RoutedEventHandler(AllButtons_Click);
      gameboardGrid.Children.Add(codeButton);
    }
  }
}  
1 голос
/ 11 ноября 2011

Вы можете просто назначить каждой кнопке Tag, идентифицирующую кнопку. Таким образом, вы можете сделать свой код независимым от физического расположения кнопок. Таким образом, вы можете просто сгенерировать свои кнопки, добавить их в таблицу и не иметь никаких других ссылок на них.

Я бы посоветовал вводить в Tag не координаты, а лучше то, что соответствует фактической семантике кнопки (например, номер, который должен быть набран при нажатии кнопки, или параметры для действие, которое будет выполнено).

...