Клавиши Alt и вкладка не работают в Windows Forms, открытых из приложения WPF - PullRequest
5 голосов
/ 31 января 2012

У меня есть много старых приложений Windows Forms, которые в конечном итоге будут перенесены в WPF (это большое приложение, поэтому его нельзя сделать за один спринт), и я начал этот процесс с создания главного меню в WPF.Приложения Windows Forms - это отдельные окна, открываемые из этого меню.

Приложения Windows Forms открываются и работают без проблем , за исключением проблем, возникающих у меня с ярлыком и Tab клавиш.Клавиша табуляции не перемещает фокус на следующий элемент управления, и клавиша Alt для вызова кнопки & Search больше не работает.

Что я делаю не так?

Ответы [ 5 ]

4 голосов
/ 11 сентября 2013

Частичное решение, которое я обнаружил, состоит в том, чтобы вызвать это из вашего конструктора WPF: System.Windows.Forms.Integration.WindowsFormsHost.EnableWindowsFormsInterop ();(Вам нужно сослаться на dll WindowsFormsIntegration.dll)

Я говорю частичное, потому что не все нажатия клавиш работают, как ожидалось.Например, кажется, что все в порядке для простых форм.

Смотрите это:
http://msdn.microsoft.com/en-us/library/system.windows.forms.integration.windowsformshost.enablewindowsformsinterop(v=vs.100).aspx

3 голосов
/ 01 февраля 2012

Мне, наконец, удалось решить проблему, разместив winform внутри элемента управления WindowsFormsHost внутри формы WPF.

public partial class MyWindow : Window
{
    public MyWindow()
    {
        InitializeComponent();

        Form winform = new Form();
        // to embed a winform using windowsFormsHost, you need to explicitly
        // tell the form it is not the top level control or you will get
        // a runtime error.
        winform.TopLevel = false;

        // hide border because it will already have the WPF window border
        winform.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        this.windowsFormsHost.Child = winform;
    }

}

Обратите внимание, что вам также может понадобиться подключить событие закрытия winform, если у вас есть кнопка для закрытия формы.

3 голосов
/ 01 февраля 2012

Это по замыслу. Сочетания клавиш обрабатываются на уровне цикла сообщений, обнаруженные за до , когда сообщение Windows отправляется в окно с фокусом. Вот почему эти клавиши могут работать независимо от фокуса.

Проблема в том, что у вас нет цикла сообщений Winforms, качающего сообщения. Application.Run () реализован в вашей программе WPF, а не Winforms. Поэтому любой код в Winforms, который обрабатывает сообщения клавиатуры для реализации сочетаний клавиш, не будет работать.

Хорошего решения для этого нет, это принципиально проблема «не забеременеть». Этот код в Winforms сильно заблокирован, поскольку он позволяет обход CAS. Единственный обходной путь - это отображение производного класса Form, содержащего элементы управления Winforms, с его методом ShowDialog (). Этот метод прокачивает модальный цикл сообщений, Winforms, достаточно хороший, чтобы оживить код обработки сочетаний клавиш. Перестройте ваш подход, сначала преобразуя главные окна, затем диалоговые.

2 голосов
/ 28 января 2016

Другое решение, которое я нашел для обработки фокуса на клавише Tab , заключается в переопределении OnKeyDown следующим образом:

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyCode == Keys.Tab)
    {
        HandleFocus(this, ActiveControl);
    }
    else
    {
        base.OnKeyDown(e);
    }
}

internal static void HandleFocus(Control parent, Control current)
{
    Keyboard keyboard = new Keyboard();
    // Move to the first control that can receive focus, taking into account
    // the possibility that the user pressed <Shift>+<Tab>, in which case we
    // need to start at the end and work backwards.
    System.Windows.Forms.Control ctl = parent.GetNextControl(current, !keyboard.ShiftKeyDown);
    while (null != ctl)
    {
        if (ctl.Enabled && ctl.CanSelect)
        {
            ctl.Focus();
            break;
        }
        else
        {
            ctl = parent.GetNextControl(ctl, !keyboard.ShiftKeyDown);
        }
    }
}

Преимущество этого решения в том, что оно не требует ниWindowsFormsHost или насос сообщений, который может быть затруднительным для реализации.Но я не знаю, возможно ли обрабатывать такие сочетания клавиш, потому что мне это не нужно.

1 голос
/ 31 января 2012

Проверьте, назначены ли IsTabStop="True" и TabIndex.Для ярлыка Alt + Key попробуйте использовать символ подчеркивания (_) вместо амперсанда (&).

...