Как сделать так, чтобы события главной формы меню обрабатывались на OwnedForms? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть Main Form с MenuStrip на нем, и я использую это MenuStrip, чтобы открыть новые Form, например:

var target = new Target();
target.Owner = this;
target.Show();

Это работает именно так, как я хочу: Form s всегда отображаются перед Main Form.

Проблема, с которой я сталкиваюсь, заключается в том, что, когда один из этих Form s имеет фокус, я не могу получить доступ к MenuStrip через клавиатуру. Мне бы хотелось, чтобы CTRL + S активировал функцию сохранения, так же, как и при Main Form с фокусом.

Возможно ли это? Есть ли лучший способ приблизиться к этому?

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Извините за задержку, но если у вас все еще есть проблемы или вы ищете другой метод, см. Ниже.

В вашей основной форме:

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        ChildForm child = new ChildForm();
        // KeyPreview can be set in the properties of the child form instead
        child.KeyPreview = true;
        child.KeyPressed += Child_KeyPressed;
        child.ShowDialog();
    }

    private void Child_KeyPressed(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.S)
        {
            // Save Pressed
        }
    }
}

, а затем в вашем ребенкеФорма:

public partial class ChildForm : Form
{
    public event EventHandler<KeyEventArgs> KeyPressed;

    public ChildForm()
    {
        InitializeComponent();
    }

    private void Child1_KeyUp(object sender, KeyEventArgs e)
    {
        KeyPressed?.Invoke(sender, e);
    }
}
0 голосов
/ 10 июня 2019

Спасибо Troy Mac1ure за направление. Вот решение, которое позволяет мне использовать ShortCutKeys из главного меню.

ownedForm.KeyPreview = true;
ownedForm.KeyDown += OwnedForm_KeyDown;

private void OwnedForm_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control)
    {
        foreach (ToolStripMenuItem menuItem in menu.Items)
        {
            foreach (ToolStripMenuItem item in menuItem.DropDownItems.OfType<ToolStripMenuItem>())
            {
                if (item.ShortcutKeys == e.KeyData)
                {
                    item.PerformClick();
                    return;
                }
            }
        }
    }
}

Это не обрабатывает Alt активацию меню, но Paint.NET также не справляется с этим, поэтому я считаю, что это хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...