Ключ захвата в WPF - PullRequest
       4

Ключ захвата в WPF

1 голос
/ 08 декабря 2010

У меня есть пользовательский контроль WPF в WinForm:

alt text

Зеленая часть - WPF UserControl ..

Код UserControl ниже:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    protected override void OnPreviewKeyUp(KeyEventArgs e)
    {
        base.OnPreviewKeyUp(e);
        MessageBox.Show(e.Key.ToString());
    }
}

XAML:

<UserControl>
    <Grid Background="DarkGreen">
        <Label Content="Label" Margin="64,105,0,0" Name="label1" />
    </Grid>
</UserControl>

Каждый раз, когда я открываю tabPage2, мне нужно «слушать» команды клавиатуры.

Фактический код не работает (любое сообщение при нажатии клавиатуры с открытой вкладкойPage2).

Почему?

РЕДАКТИРОВАТЬ 1

Обновлен код WinForms:

    private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (this.tabControl1.SelectedIndex == 1)
        {
            ElementHost elHost = (this.tabControl1.SelectedTab.Controls[0] as ElementHost);
            bool success = false;
            if (elHost != null)
            {
                success = elHost.Focus();
                Console.WriteLine("Success : {0}", success);
            }                
        }
    }

Результат:

Function: WindowsFormsApplication2.Form1.tabPage2_Enter
Function: WindowsFormsApplication2.Form1.tabControl1_SelectedIndexChanged
Success : True

Однако результат тот же: любой keyUp захватывается пользовательским контролем WPF.

Ответы [ 2 ]

1 голос
/ 08 декабря 2010

События обрабатываются, только когда ElementHost имеет фокус.Подробнее см. здесь .

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
     (this.tabControl1.SelectedTab.Controls[0] as ElementHost).Focus();
}
0 голосов
/ 20 мая 2013

Это происходит потому, что обмен сообщениями между WinForms и WPF различен.

Вот решение, которое я придумал для этого.

В вашем контроле WinForms слушайте ключевые события элемента управления WPF

_wpfHost.Child = MyWpfControl;
MyWpfControl.Name = "MyWpfControl";

this.MyWpfControl.PreviewKeyDown += WpfControlOnPreviewKeyDown;

В WpfControlOnPreviewKeyDown делайте свою логику. Мне пришлось добавить событие в другой элемент управления WinForms, который нуждался в событиях клавиатуры.

private void WpfControlOnPreviewKeyDown(object sender, KeyEventArgs args)
{
    if (args.Key != System.Windows.Input.Key.Enter) return;

    // bubble up the event
    var message = new System.Windows.Forms.Message { WParam = (IntPtr)Keys.Enter };
    this.ProcessKeyPreview(ref message);
}

Мне нужен был только ключ ввода.

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