0

コードを介して入力されているグリッドがあります。これは私の実装です:

for (int i = 1; i <= 3; i++)
{
     for (int j = 0; j < 3; j++)
     {
          Image oImage = new Image();
          Window.myGrid.Children.Add(oImage);

          oImageSource.UriSource = oImageUri;

          oImage.Source = oImageSource;

          Grid.SetRow(oImage, i);
          Grid.SetColumn(oImage, j);
     }
}

私はそれを使って次のことができる解決策を探しています:

oImage子として追加したオブジェクトをクリックすると、関数がトリガーされ、スロットのがそのパラメーターになります。

したがって、次のグリッドがある場合(各番号はグリッドに追加されたオブジェクトを表します):

1 | 2 | 3

4 | 5 | 6

7 | 8 | 9

クリックする9と関数がトリガーされますfunc(2, 2)(行と列のインデックスは2です)

4

2 に答える 2

1

注意が必要ですが、ラムダ式のクロージャー機能を利用してこれを機能させることができます。

内側のforループ内で、次のようなことを行います。

Image oImage = new Image();
Window.myGrid.Children.Add(oImage);

var row = i;
var col = j;
oImage.MouseUp += (sender, args) => func(row, col);

これにより、指定されたラムダ式がインスタンスのMouseUpイベントにアタッチされ、適切な値で関数が呼び出されます。Imageラムダ式は、スコープを離れた後でもこれらの変数を閉じ、それらの値を記憶します。

ここで重要なのは、ローカルスコープの変数をパラメーターとして使用する必要があるということです。そうすることで、ループの新しいコピーを作成し、rowそれぞれcolがループを通過します。具体的には、使用することはできません。ランバは、最後の値をfunc(i,j)「記憶」し、9つの画像すべてで常に呼び出されます。ijfunc(3,3)

于 2012-07-28T23:13:05.090 に答える
1

次のようなハンドラーに画像をバインドできます

oImage.MouseUp +=new MouseButtonEventHandler(oImage_MouseUp);

次に、ハンドラーでGrid.GetColumnとGrid.GetRowを使用してプロパティを取得できます

private void oImage_MouseUp(object sender, MouseButtonEventArgs e)
    {
        Image bb = (Image)sender;
        func(Grid.GetRow(bb), Grid.GetColumn(bb));
    }
于 2012-07-29T04:47:16.373 に答える