クイック答え:
[GLib.ConnectBefore]
protected virtual void AddButtonPressed(object sender, EventArgs e) {
Console.WriteLine("Button pressed");
for (uint i = 0; i < plus.Length; i++) {
if (sender.Equals(plus[i])) {
uint index = i;
i = (uint)plus.Length;
Console.WriteLine(index);
}
}
}
ランブリング説明:
これは実際に興味深い質問です。これは、リリース0.15のとおり、のGtk#は が信号にイベントハンドラを接続する際CONNECT_AFTERフラグを使用して を開始」を見つけるために検索のビットを取ったが、GTK#'s FAQ(しかし、私は頻繁にリンクされていない推測)と言い、
。 これは、イベントハンドラは、イベント ハンドラが実行したときにウィジェット が更新されることを意味し、デフォルトの信号 ハンドラの後まで実行します。この 変更の副作用が、その場合には デフォルトで ないことを意味ハンドラが真を返して停止する シグナル伝搬、Gtk#eve ntsは になりません。これは、Gtk.Buttonの の例です。 button-press-eventデフォルトシグナル ハンドラは、Press イベントを送出するようにオーバーライドされています。
潜在的に混乱しますが、これは実際にはバグではありません。 Gtk.Buttonを使用すると、 というウィジェットが表示され、Button1を押すと というレスポンスでPressedイベントが発生します。 ボタンの色を変更したい場合や、 Button3のコンテキストメニューを押すと、Gtk.Buttonではない が表示されます。正しい このようなウィジェットを実装する方法は、 サブクラスGtk.Buttonになり、 のOnButtonPressEvent仮想メソッドをオーバーライドして という新しい動作を実装すると、 が望みます。「
それは、のためにでなかった場合は、 『一般市民の抗議』(良好な界面のまれ記号)、これを回避する方法はありません、サブクラスを除くによるの不足のためにC#で、時には迷惑ですGLib.ConnectBefore属性が入っています。基本的には、このイベントハンドラを最初に呼び出すと、イベントはGtk +によって悪用されません。
私はもともとは、イベントハンドラに "余分な"パラメータを渡すことについて、実績のある解決策を適用することを提案していましたが、この場合は、equalsまたはName
を使用せずにインデックスを見つけることができます文字列それは基本的に私「ふり」というラッパーデリゲートを作成nvolvesはButtonPressEventHandlerすることがなく、内部的にあなたのバックメソッドにint型を渡します。これは、コンパイルし、エラーなしで実行されますが、それは同じ問題を抱えている
Func<uint, ButtonPressEventHandler> indexWrapper = ((index) => ((s, e) => { AddButtonPressed_wrapped(s, e, index); }));
...
plus[i].ButtonPressEvent += indexWrapper(i);
...
protected virtual void AddButtonPressed_wrapped(object sender, EventArgs e, uint index)
{
Console.WriteLine("Button pressed");
Console.WriteLine("Index = {0}", index);
}
、イベントが発火することはありません。デリゲート/ラムダに属性を直接入れることはできないことに気付きました。したがって、バッキングメソッドが[GLib.ConnectBefore]
であっても、デリゲートはそうしないので失敗します。
最後に、のようにClickedイベントを使用できます。期待どおりに動作することを確認しました。マウスクリックでのみ発射すると思う人もいますが、実際にはスペースバーでも発砲します。
私は今のところ短いハッキーな方法を取った;-) この非常に詳細な答えとあなたの投資時間ありがとう! ところで少し修正:それは[GLib.ConnectBeforeAttribute] –
する必要があります実際には、いずれかの方法で動作します。 http://www.go-mono.com/docs/index.aspx?link=C%3AGtk.ButtonPressEventArgsを参照してください。私はまた、http://msdn.microsoft.com/en-us/library/aa288454(VS.71).aspxを見つけました。「慣例により、すべての属性名は「属性」という単語で終わり、他の属性名と区別することができますただし、コード内の属性を使用するときに属性サフィックスを指定する必要はありません。 –