1

重複の可能性:
イベントハンドラーに引数を渡す

から発生したイベントを処理しようとしていMenuItem.Clickます。キャッチは、カスタム引数を渡す方法が必要です(具体的には、行と列を表す2つの整数)。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    ...
    MenuItem froNewChild = new MenuItem();
    froNewChild.Header = "Insert new box";
    froNewChild.Click += new RoutedEventHandler(froNewChild_Click);
    // froNewChild.Click += new RoutedEventHandler(froNewChild_Click, column, row);
    FlowRectangleOptions.Items.Add(froNewChild);
    ...
}

private void froNewChild_Click(object sender, RoutedEventArgs e) //+column & row
{
    FlowDocument.allColumns[column-1].AddFlowRectangle(column, row);
    FlowDocument.ReRenderAll(canvas1);
}

この回答イベントハンドラーに引数を渡すと、sender私が望むことを実行するように見えますが、このスコープで既に定義されているため、そのままでは機能しません。悲しいことに、私はその問題を回避するのに十分なことをまだ知りません-アドバイスは大歓迎です!

4

3 に答える 3

2

ロードされたメソッドに「column」と「row」が作成されていると仮定すると、Lambdaイベントハンドラーを使用するだけで、に変数を渡すことができます。

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        //Assumming "column" and "row" are in this block somewhere.
        ...
        MenuItem froNewChild = new MenuItem();
        froNewChild.Header = "Insert new box";
        froNewChild.Click += (s, eArgs) =>
        {
            FlowDocument.allColumns[column - 1].AddFlowRectangle(column, row);
            FlowDocument.ReRenderAll(canvas1);
        };
        FlowRectangleOptions.Items.Add(froNewChild);
        ...
    }
于 2013-01-03T21:54:53.670 に答える
0

evantハンドラーに渡される引数は、raisingクラスがどのように設計されているかによって異なりEventArgs、2番目の引数として派生したクラスとして渡されます。あなたがイベントを提起するクラスのデザイナーでない限り、これを増強することは不可能です。この特定のケースでは、フレームワーククラスについて話しているので、それはまったく不可能です。

回避策として、クラスでいくつかの状態メンバー変数を定義し、それらを使用してハンドラーに情報を渡すことができます。

于 2013-01-03T21:51:53.307 に答える
0

sa_ddam213はすでに回答していますが、明確にするために、ラムダ式のパラメーター名には意味的な意味がなく、任意の名前にすることができます。送信者とeventArgsという名前は、リンクした質問を明確にするためにのみ使用されました。この場合に重要なのは、2つのパラメーターがあり、コンパイラーが残りを自分で推測することです。

列と行の値は、ラムダを定義した時点でキャプチャされ、MainWindow_Loadedがずっと前に返され、元の変数が破棄された場合でも、イベントハンドラーが実行されるときに使用可能になります。

C#でのラムダ式の詳細については、http://msdn.microsoft.com/en-us/library/bb397687.aspxを参照してください。

于 2013-01-03T22:06:51.173 に答える