WPF TextBox, не принимающий Вход, когда в ElementHost в Формах Окна

Я не нашел способ передать ссылку, поэтому вместо этого я адаптировал эту мерзость

  checkIfParent = e => {
    let node = e.target;
    while (node) {
      if (node.id && node.id === 'ParentId') {
        return true;
      }
      node = node.parentNode;
    }
    return false;
  };

20
задан MikeTheLiar 2 September 2014 в 20:54
поделиться

2 ответа

Я наконец-то понял это после 2-х дней разметки головы ...

Диалоговое окно MFC принимало сообщения WM_CHAR и не позволяло контролю обрабатывать ввод , Поэтому, чтобы предотвратить это, я перехватываю HwndSource, и всякий раз, когда я получаю сообщение WM_GETDLGCODE , я отвечаю типами входных данных для принятия, а затем отмечаю событие как обработанное.

Я создал свой собственный TextBox для предотвращения необходимости исправления каждого текстового поля (см. Ниже):

    /// <summary>
    /// Interop Enabled TextBox : This TextBox will properly handle WM_GETDLGCODE Messages allowing Key Input
    /// </summary>
    class IOTextBox : TextBox
    {
        private const UInt32 DLGC_WANTARROWS = 0x0001;
        private const UInt32 DLGC_WANTTAB = 0x0002;
        private const UInt32 DLGC_WANTALLKEYS = 0x0004;
        private const UInt32 DLGC_HASSETSEL = 0x0008;
        private const UInt32 DLGC_WANTCHARS = 0x0080;
        private const UInt32 WM_GETDLGCODE = 0x0087;

        public IOTextBox() : base()
        {
            Loaded += delegate
                          {
                              HwndSource s = HwndSource.FromVisual(this) as HwndSource;
                              if (s != null)
                                  s.AddHook(new HwndSourceHook(ChildHwndSourceHook));
                          };
        }

        IntPtr ChildHwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            if (msg == WM_GETDLGCODE)
            {
                handled = true;
                return new IntPtr(DLGC_WANTCHARS | DLGC_WANTARROWS | DLGC_HASSETSEL);
            }
            return IntPtr.Zero;
        }
    }
22
ответ дан 29 November 2019 в 23:33
поделиться

Проверьте мой собственный вопрос об этой же вещи. в конце концов, все, что вам нужно, это что-то вроде этого:

Window window1 = new Window();
ElementHost.EnableModelessKeyboardInterop(window1);
window1.Show();

Почему мое текстовое поле WPF «вроде» только для чтения?

10
ответ дан 29 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: