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

时间:2011-11-11 19:19:29

标签: c# windows-phone-7 grid coordinates

我需要生成一个按钮网格,这些按钮将排列在表格上。按钮都将执行相同的代码,但应该能够识别所单击按钮的指定x和y值。关于如何实现这一点,我有3个想法,但我不知道哪个是最好的。

  1. 我可以创建一个按钮对象的二维数组,只需读入两个索引作为x和y坐标。这样我就可以轻松地为所有按钮分配相同的代码,但它不像数组那样灵活。
  2. 我可以创建一个列表列表(x轴列表,每个轴都有一个y轴列表),并根据我的网格大小为它们添加按钮。我不相信有一种方法可以为所有这些代码分配单个代码块,但不会将每个代码块直接指向同一个事件处理程序(尽管我认为我可以指向生成按钮对象的时间)。
  3. 创建一个存储按钮,X和Y值的新类。该类还包含内置功能,可根据需要处理添加/删除。
  4. 我不知道是否有更简单的解决方案 - 最终结果将是一个可点击的网格,可以打开或关闭点击的对象,然后将“on”按钮的坐标输入数据库。

2 个答案:

答案 0 :(得分:3)

这是一些简单的代码,可以满足您的需求。将所有按钮连接到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);
    }
  }
}  

答案 1 :(得分:1)

您可以只指定每个按钮Tag,以识别按钮。这样,您可以使代码独立于按钮的物理位置。这样您就可以生成按钮,将它们添加到网格中,并且没有任何其他引用。

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