2015-07-02 2 views
0

Возникла проблема с DataGrid. Иногда (обычно каждый третий/четвертый ... раз), фиксирующий значение с помощью клавиши [enter], начинает редактирование следующей ячейки и автоматически вводит символ новой строки (делая ячейку 2 строки), заменяя текущее значение. Таким образом, как и клавиша [enter] добавляется, как если бы пользователь набрал ее.BeginningEdit вызывается после фиксации в WPF DataGrid при нажатии Enter

Я отлаживал и что происходит при нажатии Enter, CellEditEnding() вызывается с Commit, но сразу после BeginningEdit() вызывается «кем-то». Столбец для этого ненужного BeginningEdit() такой же, как я начал редактировать ячейку вручную. Обратите внимание, что это происходит только эпизодически (но воспроизводимо). Возможно, у кого-то есть идея, с чего мне начать заниматься этой проблемой? Важно, это происходит только в том случае, если элемент управления WPF встроен в элемент управления .NET через ElementHost и используется как элемент управления COM (в нашем случае - код C++). Если элемент управления WPF используется непосредственно в окне WPF, это нормально, такого поведения нет.

Прилагаю экран для лучшего понимания.

enter image description here

ответ

0

Я думаю, я нашел решение, есть некоторые намеки здесь: WPF TextBox not accepting Input when in ElementHost in Window Forms

Проблема, кажется, с интеграцией управления WPF в .NET Forms. При нажатии на кнопку отправляются следующие события: WM_KEYDOWN + WM_CHAR + WM_KEYUP.

Игнорирование WM_CHAR для входа, кажется, разрешает двойную проблему, но держите клавишу ввода в рабочем состоянии.

IntPtr ChildHwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    if (msg == WM_CHAR) 
    { 
      // avoid duplicated enter when parent window is a native window 
      if (wParam.ToInt32() == 13) 
       handled = true; //enter is handled by WM_KEYDOWN, and WM_CHAR follows. Removing this WM_CHAR will solve the double enter issue, but keep the enter working 
    } 
    if (msg == WM_GETDLGCODE) 
    { 
     handled = true; 
     return new IntPtr(DLGC_WANTALLKEYS | DLGC_WANTARROWS | DLGC_HASSETSEL); 
    } 
    return IntPtr.Zero; 
} 
... 

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