按下 Enter 后在 WPF DataGrid 中提交后调用 BeginningEdit

BeginningEdit called after commit in WPF DataGrid when Enter pressed

DataGrid 存在问题。有时(通常每 3 次/4 次...)使用 [enter] 键提交值将开始编辑下一个单元格,并自动键入换行符(使单元格成为 2 行),替换当前值。所以就像添加 [enter] 键一样,就好像用户会输入它一样。

我进行了调试,当按下 Enter 时发生了什么,CellEditEnding() 调用了 Commit,但紧接着 "somebody" 调用了 BeginningEdit()。这个不必要的 BeginningEdit() 的调用堆栈与我开始手动编辑单元格时的调用堆栈相同。 再次注意,这只是偶尔发生(但可重现)。 也许有人有想法,我应该如何处理这个问题? 重要的是,如果 WPF 控件通过 ElementHost 嵌入到 .NET 控件中,并且它被用作 COM 控件(在我们的例子中,来自 C++ 代码),它只会发生。 如果直接在WPF中使用WPF控件Window,没关系,没有这种行为。

我附上一个屏幕以便更好地理解。

我想我找到了解决方案,在这里得到了一些提示: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));
};