2011-11-11 18 views
1

フォームに配置されるボタンのグリッドを生成する必要があります。ボタンはすべて同じコードを実行しますが、クリックされたボタンの割り当てられたxとyの値を識別できる必要があります。私はどのようにこれを達成するための3つのアイデアを持っていますが、私は最高になるか分からない。グリッドにボタンを生成して配置し、x、y座標で参照する

  1. ボタンオブジェクトの2次元配列を作成し、2つのインデックスをx座標とy座標として読み取ることができます。これにより、すべてのボタンに同じコードを簡単に割り当てることができますが、配列としての柔軟性はありません。
  2. リストのリスト(y軸のリストを持つx軸のリスト)を作成し、グリッドのサイズに基づいてボタンを追加することができます。私は、ボタンオブジェクトの生成時にポインティングを行うことができるとは思いますが、それぞれに同じイベントハンドラを直接指すことなく、それらのすべてに単一のコードブロックを割り当てる方法はあるとは思いません。
  3. ボタン、X値、およびY値を格納する新しいクラスを作成します。このクラスには、必要に応じて追加/削除を処理する組み込みの機能も含まれています。

任意のシンプルな解決策があるかどうかはわからない - 最終結果は、データベースへのボタン「上」の座標を送り、オンまたはオフにクリックしたオブジェクトを切り替えますクリッカブルグリッドになります。

答えて

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> 

で同じイベントハンドラにすべてのボタンが次にクリックハンドラで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) ; 

} 

EDIT

あなたは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); 
    } 
    } 
} 
+0

私はXAMLのアイデアを考えましたが、ユーザーの入力に基づいてボタンをオンザフライで生成しています。実行時に無名のボタンを何度もグリッドに追加できますか? –

+0

はい、インスタンス化してグリッドに追加することができます。 –

+0

コードにボタンを追加する方法を示すために私の答えを編集しました。 –

1

ボタンを指定すると、すべてのボタンにTagというボタンを割り当てることができます。この方法で、コードをボタンの物理的位置とは無関係にすることができます。こうすることで、ボタンを生成してグリッドに追加するだけで、他のボタンは表示されません。

Tagには座標は入れませんが、ボタンの実際のセマンティクスに対応するものが良いでしょう(たとえば、ボタンを押したときにダイヤルする番号、または実行されるアクション)。

関連する問題