私は、基本クラスのDockedToolWindowを持っているで基本クラスのイベントレイズ:DockedToolWindowから派生フォーム、および多くのクラスを。私は保持し、DockedToolWindowオブジェクトにイベントを割り当てるコンテナクラスがありますが、子クラスからイベントを呼び出す必要があります。派生クラスC#
は、私が実際にこのMSDN siteは私が何を言っているものを実装する方法について質問があります。
// The event. Note that by using the generic EventHandler<T> event type
// we do not need to declare a separate delegate type.
public event EventHandler<ShapeEventArgs> ShapeChanged;
public abstract void Draw();
//The event-invoking method that derived classes can override.
protected virtual void OnShapeChanged(ShapeEventArgs e)
{
// Make a temporary copy of the event to avoid possibility of
// a race condition if the last subscriber unsubscribes
// immediately after the null check and before the event is raised.
EventHandler<ShapeEventArgs> handler = ShapeChanged;
if (handler != null)
{
handler(this, e);
}
}
確かに、この例では、コンパイルと動作しますが、私は「移動」(私はフォームから派生から取得したイベント)と「ShapeChanged」を交換するとき、私はできないと言ってもエラー:以下のこのセクションでは、私に問題を与えています+ =または - =なしで右に移動してください。 ShapeEventArgs汎用タグも削除しました。
これはなぜ動作しないのですか?クラス内で宣言されたイベントと継承されたイベントの違いは何ですか?
私はOnMove()がこれを解決することを見ていますが、OnMove()が必要なときにどのように明示的に呼び出すことができませんか?フレームワークがMove代理人を実際に呼び出す場所はわかりませんが、とにかく私は隠されているでしょう。 – Balk
OnMoveはOnShapeChangedがコード内のShapeChangedイベントを発生させるのと同じ方法でMoveイベントを発生させます。イベントを発生させる保護されたメンバを追加して、派生したクラスでイベントを可視化するのが一般的なパターンです。その場合、通常は "On"プレフィックスが追加されます(OnMove、OnClickなど) – Groo
フレームワークが実際にMoveイベントを発生させる場所を確認するには、Reflectorツール(http://www.red-gate.com/products/reflector /)を使用して、Form.OnMoveメソッドのソースコードを取得します。 – Groo