1

UserControl があり、KeyDown イベントの問題に直面しています。私の UserControls は、以下のような Windows フォーム キーダウン イベントの取り消しに対して表示されます。

ユーザー コントロールのイベント:

private void UserControl_KeyDown(object sender,KeyEventArgs e)
{
        if ((Keys)e.KeyCode == Keys.Escape) 
        {
            this.Visible = false;

        }

}

上記のイベントは UserControl を非表示にする必要がありますが、以下のように Windows フォームのキーダウンが取り消されたため、イベントは発生しません。

Windows フォーム:

private void button1_Click(object sender, EventArgs e)
{
        panel1.SendToBack();
        panel2.SendToBack();
        panel3.SendToBack();
        panel4.SendToBack();
        am.Focus();
        this.KeyDown -= new KeyEventHandler(Form1_KeyDown);

}

これは、以下のように UserControls が Windows フォームに追加されると、UserControls を表示します。

    private UserControl.UserControl am = new UserControl.UserControl();
    public Form1()
    {
        InitializeComponent();
        this.Controls.Add(am);

    }

UserControl の可視に対する winform の keydown イベントを取り消し、UserControl を非表示にするために UserControl の keydown イベントを発生させたいのですが、うまくいきません。UserControl イベントの keydown イベントは発生しません。なぜだかわからない?. 適切な方法で同じことを行うには?.

4

1 に答える 1

13

キーボード通知は、フォーカスのあるコントロールに送信されます。これはほとんど UserControl ではなく、フォーカスを必要としません。Focus() メソッドで明示的にフォーカスを設定した場合でも、すぐにその子コントロールの 1 つに渡されます。UserControl は、他のコントロールの単なるコンテナーとして設計されました。

代わりに ProcessCmdKey() メソッドをオーバーライドしてください。次のコードをコントロール クラスに貼り付けます。

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == Keys.Escape) {
            this.Visible = false;
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

Escape キーを使用することは最善のアイデアではないことに注意してください。ユーザー コントロールを配置するフォームでは、そのキーが必要になる場合があります。ダイアログのように。

于 2012-11-09T13:21:55.680 に答える