在网格中生成和放置按钮,通过x,y坐标进行引用

本文关键字:通过 引用 坐标 按钮 网格 | 更新日期: 2023-09-27 18:14:21

我需要生成一个网格按钮,这将安排在一个窗体上。这些按钮都将执行相同的代码,但应该能够识别所单击按钮的分配的x和y值。我有三个想法,但我不知道哪个是最好的。

  1. 我可以创建一个按钮对象的二维数组,并简单地读取两个索引作为x和y坐标。这将允许我轻松地为所有按钮分配相同的代码,但它没有数组那么灵活。
  2. 我可以创建一个列表的列表(x轴列表每个y轴列表),并根据网格的大小添加按钮。我不相信有一种方法来分配一个代码块的所有他们,虽然,没有指向每个直接相同的事件处理程序(虽然我想我可以做在生成按钮对象的时候指向)。创建一个新类,存储一个按钮、一个X和一个Y值。该类还将包含内置功能来处理必要的添加/删除。

我不知道是否有任何更简单的解决方案-最终结果将是一个可点击的网格,将切换点击对象打开或关闭,然后将"打开"按钮的坐标输入数据库。

在网格中生成和放置按钮,通过x,y坐标进行引用

下面是一些您想要的简单代码。将所有按钮连接到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>

然后在单击处理程序中获取相对于LayoutRoot元素的x、y坐标。

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

您可以为每个按钮分配一个Tag,标识按钮。通过这种方式,您可以使代码独立于按钮的物理位置。这样,您就可以生成按钮,将它们添加到网格中,而不需要任何其他引用它们。

我建议放入Tag不是坐标,而是与按钮的实际语义相对应的东西(例如,当按下按钮时必须拨打的号码,或要执行的动作的参数)。