Переопределить метод ProcessDialogKey для нескольких форм - PullRequest
3 голосов
/ 03 мая 2019

Я создаю приложение C # Winforms и использую клавишу ESC для закрытия формы.

У меня есть этот фрагмент кода на каждой форме, но я хотел бы иметь его в одном месте:

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }

    return base.ProcessDialogKey(keyData);
}

Это работает, но это означает, что нужно добавлять этот кусок к каждой форме, которую я делаю.

Как я могу заставить эту работу работать с каждой имеющейся у меня формой, не добавляя этот код во все формы?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 03 мая 2019

Самое простое решение (наименьшая запись кода) - создать собственную форму, унаследованную от базовой, и переопределить там метод.Затем каждый раз, когда вы будете создавать новую форму, будет использоваться ваша EscapeForm.

Примерно так:

public partial class EscapeForm : Form
{      
    //You will put there your method
    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
        {
            this.Close();
            return true;
        }

        return base.ProcessDialogKey(keyData);
    }
}

А теперь каждую форму, которую вы будете использовать, вы можете просто использоватьвот этот:

public partial class LoginForm : EscapeForm
{
     //All the staff you need to have there..
}
2 голосов
/ 03 мая 2019

Если вы вообще не хотите менять свои формы, перехватите управляющую клавишу с помощью IMessageFilter:

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();
        this.Load += Form1_Load;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Application.AddMessageFilter(new MyFilter());
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form f = new Form();
        f.Show();
    }

}

public class MyFilter : IMessageFilter
{

    private const int WM_KEYDOWN = 0x100;

    public bool PreFilterMessage(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_KEYDOWN:
                switch (m.WParam.ToInt32())
                {
                    case (int)Keys.Escape:                           
                        Form.ActiveForm.Close();
                        break;
                }
                break;

        }

        return false; // returning false allows messages to be processed normally
    }

}
2 голосов
/ 03 мая 2019

Ваши формы наследуются от Form класса.Вы можете создать класс декоратора, который наследует от Form, а затем использовать ваши формы, наследуемые от этого декоратора.

Например:

public class Decorator : Form
{
    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
        {
            this.Close();
            return true;
        }

        return base.ProcessDialogKey(keyData);
    }
}

А затем ваша форма:

public class MyForm : Decorator
{
    // your form code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...