2016-03-18 13 views
1

私はWinFormsを使用してC#でアプリケーションを作成しています。C#基本クラスのEventArgsを消費する方法

私が欲しいもの:
サイドに矢印の付いたボタンが欲しいです。矢印付きのボタンの一部が押されると、ドロップダウンが表示されますが、ボタンの他​​の部分が押された場合、マウスクリックイベントがトリガーされます。私は助けを必要と何


私は、マウスの位置を用いて、マウスの位置確認を行うことができます確信していますが、どのように私は、ボタンのインスタンスのイベントハンドラが唯一の「マウスを使用していることを確認することができますクリックされたボタンの主要部分だったときに「ボタンダウン」イベントが発生しましたか?私。ベースハンドラーでイベントをどのように食べたら、派生イベントに決して到達しないのですか?

は私が持っている:
次のように私のコード構造(簡素化)は(Windows.Forms button with drop-down menuから取られた)である:

// Button class: 
public class ButtonWithDropDown : Button 
{ 
    protected override void OnClick(EventArgs e) 
    { 
     // Check for when the mouse is on the button and dispose of the 
     // event if it's over the 'arrow' part of the button. 
    } 
} 

// Event handler: 
private void btnClickMe_Click(object sender, EventArgs e) 
{ 
    MouseEventArgs mevent = (MouseEventArgs)e; 
    if (mevent.Button == System.Windows.Forms.MouseButtons.Left) 
     MessageBox.Show("Only shown when clicking the main part of the button"); 
} 

感謝。

+0

あなたは 'base'を呼び出さない空の' override'を持っています。 –

+0

@David Pineサンプルコードのように? (私の実際のコードは 'base.OnClick(e)'を呼び出す)残念ながら私はそれを削除しようとしたが、それでもイベントを通過させる。 – Edward

+0

'.Click'イベントがリスナーを持たないようにしようとしていますか、あるいは' override void OnClick'が完全に呼び出されないようにしようとしていますか? –

答えて

0

Control.Clickの代わりにControl.MouseClickを正しく配線していないと思います。したがって、overrideOnClickメソッドで、OnMouseClickが呼び出されないようにしたい場合は間違います。

例えばイベントのプラス名称、「オン」の命名規則に基づいて、各eventに異なるイベントや各overrideマップがたくさんあります:リスト全体がhere on MSDNを存在

┏━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓ 
┃ event name ┃ protected virtual method ┃ 
┣━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━┫ 
┃ Click  ┃ OnClick     ┃ 
┃ MouseClick ┃ OnMouseClick    ┃ 
┃ ...  ┃ On...     ┃ 
┗━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 

が。さらに、Control.cshereのソースを表示することもできます。すべてのイベントがオーバーライドされているため、同じパターンに従っていることを簡単に確認できます。

最終的には、正しいeventを処理していると仮定して、baseの動作を無効にすることで、制御を完全に制御できます。